Apache Camel Route节点的消息载体Exchange

发布时间:2012-07-07 11:51:02   来源:文档文库   
字号:

Apache Camel Route节点的消息载体Exchange

分类:Camel 2012-04-06 17:11 149人阅读评论(0) 收藏举报

Camelroute,消息在Route的各个节点中是以Exchange的形式传递的,所以对Exchange结构的理解对使用Camel来说是很重要的.
Exchange ID 如果不指定,Camel会默认设置一个,可以用来标识一个route的一次执行.
MEP message exchange pattern,InOnlyInOut方式.
Exception route出异常的时候,抛出的异常赋值给这个变量(但在示例中似乎不是这样?).
In message 上一个节点传入的内容,mandatory..
Out message MEP InOut的时候才用,不是mandatory..
Headers 键值对,在下一个节点可以再取出来.
Attachments 在调用web service或者发邮件的时候放附件.
Body 消息内容,java对象.
Exchange的结构如下图所示:

Exchange可以直接作为参数在route用到的方法中使用,如果route中的方法不是Exchange,Camel会根据一套规则将Exchange中的Body转换成该方法的参数类型.

这个结构里的各部分内容可以像下面的代码示例的方式进行访问:

[java]view plaincopyprint?

1.     from("file:d:/temp/inbox?delay=3000")  

2.     .bean(new ExchangeManipulateBean(),"implicitConvert")  

3.     .bean(new ExchangeManipulateBean(),"traverseExchange")  

4.     .to("file:d:/temp/outbox");  

5.   

6. public class ExchangeManipulateBean {  

7.     private static Logger log = Logger.getLogger(ExchangeManipulateBean.class);  

8.     public void implicitConvert(String msg){          

9.             log.debug("implicitConvert: " + msg);          

10.     }  

11.     public void traverseExchange(Exchange exchange){  

12.         log.debug("exchange.getExchangeId() " + exchange.getExchangeId());  

13.         log.debug("exchange.getPattern() " + exchange.getPattern());  

14.         log.debug("exchange.getException() " + exchange.getException());  

15.           

16.         Map props = exchange.getProperties();  

17.         for(String key:props.keySet()){  

18.             log.debug("props: " + key + " " + props.get(key));  

19.         }  

20.           

21.         Message in = exchange.getIn();//in always null,but can be accessed without exception   

22.           

23.         log.debug("exchange.getIn() " + in);  

24.         log.debug("in.getMessageId() " + in.getMessageId() );  

25.         log.debug("in.getClass().getName() " + in.getClass().getName());  

26.   

27.         Map headers = in.getHeaders();  

28.         for(String key:headers.keySet()){  

29.             log.debug("headers: " + key + " " + headers.get(key));  

30.         }  

31.           

32.         Object body = in.getBody();  

33.         log.debug("body " + body  + " " + body.getClass().getName());  

34.         log.debug("in.getAttachmentNames() " + in.getAttachmentNames());  

35.         //Message out = exchange.getOut();//whenever out is touched,information in headers are lost  

1* implicitConvert的方法接收的参数是String,Camel会在运行的时候根据一定的规则将"In Message"Body转换成String,这里是将文件的内容转成String,这是由Camel内部的TypeConverter完成的.
2* exchange.getException()不能得到Exception,需要通过这样的方式: Exception exception = (Exception) exchange.getProperty(Exchange.EXCEPTION_CAUGHT);
3* exchange.getOut()被调用后,还需要将 "In Message"header里的内容在copy "Out message"中去.通常都绕过out往下一个节点传值,可以用这种方式:exchange.getIn().setBody("$contents"),
在下一个节点仍然可以得到内容,同时前面节点setheader中的内容也存在.
4*本人用的是Camel 2.7.5,不知道后续的版本会不会把这些"pitfall"给填上.

本文来源:https://www.2haoxitong.net/k/doc/0feb7ac09ec3d5bbfd0a74f0.html

《Apache Camel Route节点的消息载体Exchange.doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

文档为doc格式