Apache camel Camel多播子例程出现故障

Apache camel Camel多播子例程出现故障,apache-camel,activemq,multicast,Apache Camel,Activemq,Multicast,我有一个场景,在这个场景中,我得到的是输入消息a。然后,消息a必须被分成3种不同类型的消息,并转发到其他路由。重要的是,信息必须以精确的顺序到达,即a-1必须在a-2之前发送,而a-2必须在a-3之前发送 为此,我做了以下概述: from("activemq:queue:somequeue-local") .multicast().to("direct:a1","direct:a2","direct:a3"); from("direct:a1) //split incoming mes

我有一个场景,在这个场景中,我得到的是输入消息a。然后,消息a必须被分成3种不同类型的消息,并转发到其他路由。重要的是,信息必须以精确的顺序到达,即a-1必须在a-2之前发送,而a-2必须在a-3之前发送

为此,我做了以下概述:

from("activemq:queue:somequeue-local")
  .multicast().to("direct:a1","direct:a2","direct:a3");

from("direct:a1)
  //split incoming message and prepare output document for A-1
  .to("activemq:queue:otherqueue")

.from("direct:a2)
  //split incoming message and prepare output document for A-2
  .to("activemq:queue:otherqueue")

.from("direct:a3)
  //split incoming message and prepare output document for A-3
  .to("activemq:queue:otherqueue")
在另一种情况下,负责向外部系统发送信息,我有

.from("activemq:queue:otherqueue?maxMessagesPerTask=1&concurrentConsumers=1&maxConcurrentConsumers=1")
      // do different stuff based on which type we are called with then end with
     .beanref("somebean","writeToFileAndCallImportbat");
现在,我的问题是,当我到达接收器时,我以随机顺序获得消息。有时是A-1,A-3,A-2,有时是对的,A-1,A-2,A-3

我曾尝试将JMSXGroupID和JMSXGroupSeq添加到消息中,但没有成功

我还尝试完全跳过MQ部分,并使用direct vm:调用共享接收器,但看起来我一次有三次同时调用接收器,并且仍然是随机执行顺序

我的印象是,除非另有提示,否则多播将按顺序运行

所采取的方法是否存在根本性的问题

我使用的是Camel版本2.12

或者,更直截了当地说:

我想要一个路由,创建三个不同的输出消息,并按顺序对它们执行批处理文件。我该怎么办? 如果使用,是否已检查流属性是否设置为false

如果启用,则Camel将以流式方式拆分,这意味着它将把输入消息拆分为块。这减少了内存开销。例如,如果拆分大邮件,建议启用流式处理。如果启用流式传输,则子消息回复将按顺序聚合,例如按返回的顺序聚合。如果禁用,Camel将按照与拆分位置相同的顺序处理子邮件回复


因此,多播终究不是问题

相反,在我的每一个子路线中,我都这样做:

.split(..stax(SpecialClass)).streaming()
.beanRef("transformationBean","somefunction")
.aggregate(constant("1"), new MyAggregator())
.completionTimeout(5000)
.completionSize(1000)
.to(writeToFileAndRunBat)
我认为这意味着处理分割中的所有元素,如果你没有在5秒内或1000个元素之后完成,那么就中断

我把它改成了

.split(..stax(SpecialClass), , new MyAggregator()).streaming()
.beanRef("transformationBean","somefunction")
.end()
.to(writeToFileAndRunBat)
仔细想想,这是非常有意义的,因为第一个版本不知道我们什么时候完成了,而最后一个版本我假设只是迭代拆分中的所有元素,并为每个元素调用聚合器


还有,我必须。在第一个版本中结束。所以我猜整件事都是随机的。

你完全正确。问题在于我是如何处理拆分的,尽管不完全是因为你所说的原因。但考虑到我的示例没有显示这方面的细节,因此无法看到。