Java EIP/ApacheCamel-如何并行处理消息,但按组进行原子化处理?

Java EIP/ApacheCamel-如何并行处理消息,但按组进行原子化处理?,java,concurrency,architecture,apache-camel,enterprise-integration,Java,Concurrency,Architecture,Apache Camel,Enterprise Integration,我有以下情况: 有固定数量的组 存在传入消息的TCP流。每条消息只与一个组相关 我开始骆驼路线如下: public class MyMessage implements Runnable { public void run() { // omitted here } } from("netty:tcp://localhost:7777?textline=true&sync=false") ... // omitted here: parse m

我有以下情况:

  • 有固定数量的组
  • 存在传入消息的TCP流。每条消息只与一个组相关
我开始骆驼路线如下:

public class MyMessage implements Runnable {
    public void run() {
        // omitted here
    }
}

from("netty:tcp://localhost:7777?textline=true&sync=false")
   ... // omitted here: parse message to pojo MyMessage, set header "group-identifier"
   .to(seda:process);
此驼峰路由使用TCP流,解析每个传入消息的有效负载并将其转换为
MyMessage
pojo,并在交换机上设置与消息对应的
组标识符

现在我想消费
seda:process
,如下所示:

public class MyMessage implements Runnable {
    public void run() {
        // omitted here
    }
}

from("netty:tcp://localhost:7777?textline=true&sync=false")
   ... // omitted here: parse message to pojo MyMessage, set header "group-identifier"
   .to(seda:process);
  • 属于同一组的消息不能同时执行
  • 属于不同组的消息可以同时执行
  • 每个消息都应该通过调用
    run()
    来执行。我想为此提供/定义一个
    ExecutorService
    ,以便控制线程的数量
我可以在这里应用哪些企业集成模式?如何将这些概念映射到Camel


我了解到ActiveMQ有消息组()的概念。这可能提供一种方法来确保同一组的两条消息永远不会同时执行。尽管如此,我不确定仅为此目的引入ActiveMQ是否过火。这也可以通过“核心”Camel/Java实现吗?

在ActiveMQ中实现这一点非常容易。以下代码段根据需要模拟执行消息:

  • 属于同一组的消息按顺序执行
  • 属于不同组的消息将同时执行
这依赖于ActiveMQ消息组,如上所述

final CamelContext context=new DefaultCamelContext();
context.addComponent(“activemq”,ActiveMQComponent.ActiveMQComponent(“vm://localhost?broker.persistent=false”);
addRoutes(新RouteBuilder(){
@凌驾
public void configure(){
来自(“activemq:queue:q?concurrentConsumers=5”)
.流程(交换->{
System.out.println(Thread.currentThread()+“-”+exchange.getIn().getBody());
睡眠(5000);
});
}
});
context.start();
对于(int i=0;i<1000;++i){
context.createFluentProducerTemplate()
.withBody(“这是来自组:”+(i%5))的消息)
.withHeader(“JMSXGroupID”,“”+(i%5))
.to(“activemq:queue:q”)
.send();
}
尽管如此,我(仍然)想知道是否可以用纯EIP/驼峰核心实现这一点