Apache Camel Route节点的消息载体Exchange

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


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

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

	from("file:d:/temp/inbox?delay=3000")
	.bean(new ExchangeManipulateBean(),"implicitConvert")
	.bean(new ExchangeManipulateBean(),"traverseExchange")
	.to("file:d:/temp/outbox");

public class ExchangeManipulateBean {
    private static Logger log = Logger.getLogger(ExchangeManipulateBean.class);
    public void implicitConvert(String msg){        
            log.debug("implicitConvert: " + msg);        
    }
    public void traverseExchange(Exchange exchange){
        log.debug("exchange.getExchangeId() " + exchange.getExchangeId());
        log.debug("exchange.getPattern() " + exchange.getPattern());
        log.debug("exchange.getException() " + exchange.getException());
        
        Map<String, Object> props = exchange.getProperties();
        for(String key:props.keySet()){
            log.debug("props: " + key + " " + props.get(key));
        }
        
        Message in = exchange.getIn();//in always null,but can be accessed without exception
        
        log.debug("exchange.getIn() " + in);
        log.debug("in.getMessageId() " + in.getMessageId() );
        log.debug("in.getClass().getName() " + in.getClass().getName());

        Map<String, Object> headers = in.getHeaders();
        for(String key:headers.keySet()){
            log.debug("headers: " + key + " " + headers.get(key));
        }
        
        Object body = in.getBody();
        log.debug("body " + body  + " " + body.getClass().getName());
        log.debug("in.getAttachmentNames() " + in.getAttachmentNames());
        //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"),  
在下一个节点仍然可以得到内容,同时前面节点set在header中的内容也存在.  
4*本人用的是Camel 2.7.5,不知道后续的版本会不会把这些"pitfall"给填上.



原文链接: http://blog.csdn.net/kkdelta/article/details/7432867

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值