camel-exchange

camel-exchange 在Exchange中使用getIn 和getOut方法: camel Exchange定义了两种方法去获取信息。getIn 和getOut。 getIn()方法返回进入的信息。 getOut()方法访问出站的信息。 有两种场景是camel使用者必须决定使用上述的方法: read-only场景:例如当你记录进入的消息。 write场景

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在做信息转换是非常有用的。

知秋君
上一篇 2024-08-25 17:02
下一篇 2024-08-25 16:36

相关推荐