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&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&date=yesterday"/>
<bean ref="csvBean"/>
<to uri="file://riders/orders?fileName=report-${header.Date}.csv"/>
</route>
</camelContext>
使用bean 来替代Processor的另一个优点是,单元测试会变得容易很多。现在你应该知道,bean在做信息转换是非常有用的。