我在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的交换跟踪头并导致此问题,基本上就像一些奇怪的并发问题?
答案 0 :(得分:2)
如果没有完整的源代码很难找到错误,但请记住,多播不会进行深层复制。
如果Order对象中有子对象,则它们不会重复,并且它们在两条SEDA路径之间共享。
可能你必须对对象进行自定义深度克隆
答案 1 :(得分:0)
您的Exchange正文是自定义POJO:message.BulkAddBondOrderMsg@77df22 ...这意味着除非您添加它,否则没有深度克隆可用。如果正文是DOM XML节点,那么会发生同样的事情......
在多播之前将POJO序列化为字符串,以便可以在Exchange之间共享。