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主题"接收相同的消息(可能是克隆的)。然而,在日志中,我得到了异常,如:

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之间共享。

最新更新