camel-exchange

在Exchange中使用getIn 和getOut方法:

camel Exchange定义了两种方法去获取信息。getIn 和getOut。

getIn()方法返回进入的信息。

getOut()方法访问出站的信息。

有两种场景是camel使用者必须决定使用上述的方法:

read-only场景:例如当你记录进入的消息。

write场景:例如当你转换消息。


在第二个场景中,你认为getOut应该被使用,这个理论上是可以的,但是,实践中使用getOut会进入一个误区。传入进来消息的 headers 和 attachments将会丢失。这并不是你想要的,所以,你必须把进入信息的headers 和 attachments复制到outgoing message(流出的信息),这是非常乏味的。另一种解决方法就是直接在进入的信息使用getIn(),而不使用getOut.


在camel中使用Processor有一个缺点就是必须使用camel中的api。

import org.apache.camel.Exchange;

import org.apache.camel.Processor;

public class OrderToCsvProcessor implements Processor {

public void process(Exchange exchange) throws Exception {

String custom = exchange.getIn().getBody(String.class);

String id = custom.substring(0, 9);

String customerId = custom.substring(10, 19);

String date = custom.substring(20, 29);

String items = custom.substring(30);

String[] itemIds = items.split("@");

StringBuilder csv = new StringBuilder();

csv.append(id.trim());

csv.append(",").append(date.trim());

csv.append(",").append(customerId.trim());

for (String item : itemIds) {

csv.append(",").append(item.trim());

}

exchange.getIn().setBody(csv.toString());

}

}


from("quartz://report?cron=0+0+6+*+*+?")

.to("http://riders.com/orders/cmd=received&date=yesterday")

.process(new OrderToCsvProcessor())

.to("file://riders/orders?fileName=report-${header.Date}.csv");


Spring xml完成相同的上述功能:

<bean id="csvProcessor" class="camelinaction.OrderToCsvProcessor"/>

<camelContext xmlns="http://camel.apache.org/schema/spring">

<route>

<from uri="quartz://report?cron=0+0+6+*+*+?"/>

<to uri="http://riders.com/orders/cmd=received&amp;date=yesterday"/>

<process ref="csvProcessor"/>

<to uri="file://riders/orders?fileName=report-${header.Date}.csv"/>

</route>

</camelContext>


现在我们使用beans的方式实现上述的功能,并不使用camel中的api:

public class OrderToCsvBean {

public static String map(String custom) {

String id = custom.substring(0, 9);

String customerId = custom.substring(10, 19);

String date = custom.substring(20, 29);

String items = custom.substring(30);

String[] itemIds = items.split("@");

StringBuilder csv = new StringBuilder();

csv.append(id.trim());

csv.append(",").append(date.trim());

csv.append(",").append(customerId.trim());

for (String item : itemIds) {

csv.append(",").append(item.trim());

}

return csv.toString();

}

}


from("quartz://report?cron=0+0+6+*+*+?")

.to("http://riders.com/orders/cmd=received&date=yesterday")

.bean(new OrderToCsvBean())

.to("file://riders/orders?fileName=report-${header.Date}.csv");


Spring xml完成相同的上述功能:

<bean id="csvBean" class="camelinaction.OrderToCsvBean"/>

<camelContext xmlns="http://camel.apache.org/schema/spring">

<route>

<from uri="quartz://report?cron=0+0+6+*+*+?"/>

<to uri="http://riders.com/orders/cmd=received&amp;date=yesterday"/>

<bean ref="csvBean"/>

<to uri="file://riders/orders?fileName=report-${header.Date}.csv"/>

</route>

</camelContext>


使用bean 来替代Processor的另一个优点是,单元测试会变得容易很多。现在你应该知道,bean在做信息转换是非常有用的。



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Camel是一个开源的集成框架,它提供了一种简单而强大的方式来连接各种应用程序和系统。它支持多种协议和数据格式,并提供了丰富的路由和转换功能。MyBatis是一个持久层框架,它简化了数据库访问的过程,并提供了强大的SQL映射功能。 Camel和MyBatis可以很好地结合使用,以实现从数据库读取数据并进行处理的功能。通过Camel的路由配置,可以定义从数据库读取数据的源和目标,并使用MyBatis来执行SQL查询并将结果转换为Java对象。这样,我们可以轻松地在Camel路由中使用MyBatis来处理数据库操作。 以下是一个简单的示例,展示了如何在Camel中使用MyBatis来读取数据库数据: ```java import org.apache.camel.builder.RouteBuilder; import org.apache.camel.component.mybatis.MyBatisComponent; public class MyRouteBuilder extends RouteBuilder { @Override public void configure() throws Exception { // 配置MyBatis组件 MyBatisComponent mybatis = new MyBatisComponent(); mybatis.setConfigurationUri("classpath:mybatis-config.xml"); getContext().addComponent("mybatis", mybatis); // 定义路由 from("mybatis:selectCustomers?statementType=SelectList") .to("log:output") .to("direct:processData"); from("direct:processData") .process(exchange -> { // 处理数据的逻辑 // 获取从数据库读取的数据 List<Customer> customers = exchange.getIn().getBody(List.class); // 对数据进行处理 // ... }); } } ``` 在上面的示例中,我们首先配置了MyBatis组件,并指定了MyBatis的配置文件路径。然后,我们定义了一个路由,使用MyBatis组件从数据库中查询所有的客户数据,并将结果发送到日志和数据处理的步骤。 请注意,上述示例中的代码只是一个简单的示例,实际使用时需要根据具体的需求进行配置和处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值