Apache Camel中的直通处理

3
我希望找到在Apache Camel中进行直通处理的最佳方法。
我有几个不同的组件可以在同一个JVM中启动,这与我的activemq代理分开。尝试设置消息从一个组件传递到下一个组件,按顺序阻塞,是否有意义?我该如何设置camel以确保每条消息在下一条消息开始之前经过路由上的每个组件?
更具体地说:我想通过我的brokerURI配置来实现这一点。我看到了这个页面:http://fusesource.com/wiki/display/ProdInfo/Understanding+the+Threads+Allocated+in+ActiveMQ但我不确定在哪里/如何实施选项-优化调度似乎在代理destinationPolicy选项上起作用。
谢谢
1个回答

5

首先,在你的路由中明确配置一个从队列中消费的单个消费者...

可以为所有连接全局配置。

<bean id="jmsConfig" class="org.apache.camel.component.jms.JmsConfiguration">
    <property name="connectionFactory" ref="pooledConnectionFactory"/>
    <property name="concurrentConsumers" value="1"/>
    <property name="maxConcurrentConsumers" value="1"/>
</bean>

或者明确每个路由/消费者。
 from("activemq:queue:input?concurrentConsumers=1&maxConcurrentConcumers=1")...

接下来,你有几个选择。通常情况下,你可以使用管道模式在单个路线中同步地传递消息,或者使用camel-direct在多个路线之间提供同步的消息流。

from("activemq:queue:input?concurrentConsumers=1&maxConcurrentConcumers=1")
    .to(<step1>)
    .to(<step2>)
    ...

或者,如果您的步骤需要多条路线,则可以使用直接连接将它们连接起来...
from("activemq:queue:input?concurrentConsumers=1&maxConcurrentConsumers=1")
    .to("direct:step1");

from("direct:step1")
    //perform step1 processing
    .to(direct:step2");

from("direct:step2")
    //perform step2 processing
    .to(direct:step3");
...

那么每次消费者读取的队列都必须添加到队列中?没有办法为代理程序控制的所有队列进行配置吗? - Derek
这可以全局完成...我已经相应地更新了答案。 - Ben ODay
设置代理的异步和dispatchAsync选项怎么样?对于直通处理是否必要,我可以在TCP传输中使用吗? - Derek
如果您的目标是减少线程并同步所有内容...那么您可以设置optimizedDispatch=true和dispatchAsync=false等。但是,除非您有特定的线程问题/要求需要解决,否则通常不需要进行调整。如果您遵循我上面的示例,您将保证处理顺序,因为只允许单个消费者。此外,如果您需要更好的吞吐量但仍需要相关消息的排序,请考虑使用消息组(http://activemq.apache.org/message-groups.html),它们提供了两全其美的最佳选择。 - Ben ODay

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接