Apache Camel组播路由相互干扰

时间:2013-12-03 13:30:00

标签: java apache-camel

我在Camel DSL中使用多播,因为我需要将相同消息的副本发送到两个不同的端点。但是,似乎这些路线互相干扰。我的语法错误,还是其他问题?

from("{{in.endpoint}}")
    .routeId(this.getClass().getSimpleName())
    .multicast().parallelProcessing()
        .to("{{update.in}}", "{{add.ibmmq.topic}});

其中

in.endpoint = seda:addOrder?waitForTaskToComplete=Never
update.in = seda:updateData?waitForTaskToComplete=Never
add.ibmmq.topic = an ibmmq topic

我希望'update'路由接收'in'消息,'ibmmq topic'接收相同的消息,可能是克隆的。但是,在日志中我遇到了例外情况:

Exchange[
Id                  ID-slon12d10628-1228-1386074869307-0-44746
ExchangePattern     InOnly
Headers             {breadcrumbId=ID-slon12d10628-1228-1386074869307-0-41682, calendar=null, CamelMyBatisResult=[integration.model.EInquiry@19eb77c, integration.model.EInquiry@12059ce, xxxxxxx
BodyType            message.BulkAddOrderMsg
Body                message.BulkAddBondOrderMsg@77df22
]

但是EInquiry对象是通过完全独立的路径读入的,与此路由无关,除了它也会向“in.endpoint”发送消息。

另一件事是因为我从Tibco读取并发送给IBMMQ,我必须清除JMS头代码,因为它们不兼容,所以我放了:

exchange.getIn().getHeaders().clear();

在我的“更新”路线中。这可能是清除Camel的交换跟踪头并导致此问题,基本上就像一些奇怪的并发问题?

2 个答案:

答案 0 :(得分:2)

如果没有完整的源代码很难找到错误,但请记住,多播不会进行深层复制。

如果Order对象中有子对象,则它们不会重复,并且它们在两条SEDA路径之间共享。

可能你必须对对象进行自定义深度克隆

答案 1 :(得分:0)

您的Exchange正文是自定义POJO:message.BulkAddBondOrderMsg@77df22 ...这意味着除非您添加它,否则没有深度克隆可用。如果正文是DOM XML节点,那么会发生同样的事情......

在多播之前将POJO序列化为字符串,以便可以在Exchange之间共享。