我在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主题"接收相同的消息(可能是克隆的)。然而,在日志中,我得到了异常,如:
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的交换跟踪头并导致这个问题,基本上就像一些奇怪的并发问题一样?
如果没有完整的源代码,很难找到错误,但请记住,多播不会进行深度复制。
如果Order对象中有子对象,则它们不会重复,并且在两个SEDA管线之间共享。
您可能需要对对象进行自定义深度克隆
Exchange的主体是一个自定义POJO:message.BulkAddBondOrderMsg@77df22...这意味着除非你添加它,否则就没有深度克隆可用。如果主体是DOM XML节点,也会发生同样的事情。。。
在多播之前将POJO序列化为字符串,以便在Exchange之间共享。