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
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值