我有一个队列,其中有多条消息,都是独立的,可以并行处理。
我见过一个mutlicast路由器,它在消息中采用相同的路由并将其分配到多个接收器上,我想我还尝试了其他一些如节流机载路由策略,线程池配置文件等。
但是,我想要的是一个封装多个并行JMS会话的路由,我希望配置的总数和一次处理所有消息。
我想说明我的假设,带有from的单个路由意味着单个会话而不是n个并行会话。如果我错了,请纠正我。
我的骆驼情境看起来有点像这样:
<bean id="throttlePolicy" class="org.apache.camel.impl.ThrottlingInflightRoutePolicy">
<!-- define the scope to be context scoped so we measure against total
inflight exchanges that means for both route1, route2 and route3 all together -->
<property name="scope" value="Context" />
<!-- when we hit > 20 inflight exchanges then kick in and suspend the routes -->
<property name="maxInflightExchanges" value="20" />
<!-- when we hit lower than 10% of the max = 2 then kick in and resume
the routes the default percentage is 70% but in this demo we want a low value -->
<property name="resumePercentOfMax" value="10" />
<!-- output throttling activity at WARN level -->
<property name="loggingLevel" value="WARN" />
</bean>
<camelContext id="camel" errorHandlerRef="dlc"
xmlns="http://camel.apache.org/schema/spring">
<!-- this is the Dead Letter Channel error handler, where we send failed
message to a log endpoint -->
<errorHandler id="dlc" type="DeadLetterChannel"
deadLetterUri="jms:deadLetterQueue">
<redeliveryPolicy retryAttemptedLogLevel="INFO"
maximumRedeliveries="3" redeliveryDelay="250" backOffMultiplier="2"
useExponentialBackOff="true" />
</errorHandler>
<route routePolicyRef="throttlePolicy">
<from uri="jms:camel.design.md5InputQueue" />
<transacted ref="required" />
<process ref="basicProcessor" />
<to uri="jms:camel.integrationTest.reply" />
</route>
</camelContext>
正如您所看到的,我正在做的是计算源的MD5。我希望这样做并将结果传输到一个回复队列中并将所有这些并行完成。
为了模拟这一点,我在基本处理器中进行了一次休眠(一秒钟),我所看到的是一个接一个地顺序处理消息而不是并行处理。例如,如果有10条消息需要10秒,如果有20条消息,则需要20秒等。
如何让它并行工作并进行所有MD5计算,即使在处理器中存在睡眠条件后,也可在约2秒内完成10条输入消息。
答案 0 :(得分:2)
只需设置maxConcurrentConsumers属性即可从队列中启用多个使用者线程...
<route routePolicyRef="throttlePolicy">
<from uri="jms:camel.design.md5InputQueue?maxConcurrentConsumers=5" />
<transacted ref="required" />
<process ref="basicProcessor" />
<to uri="jms:camel.integrationTest.reply" />
</route>