複数のメッセージがすべて独立しており、並行して処理できるキューがあります。
メッセージで同じものを受け取り、それを複数の受信者に分割するマルチキャストルーターを見てきました。また、スロットルインフライトルートポリシー、スレッドプールプロファイルなどの他のいくつかも試したと思います.
ただし、私が望んでいたのは、単一のルートが複数の並列 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 の計算です。私はこれを行い、結果を応答キューに転送し、それらすべてを並行して実行したいと考えていました。
これをシミュレートするために、基本プロセッサにスリープ (1 秒) を入れました。私が見ているのは、並列処理ではなく、メッセージの順次処理です。たとえば、10 件のメッセージがある場合は 10 秒かかり、20 件のメッセージがある場合は 20 秒かかります。
これを並行して動作させ、すべての MD5 計算を行うにはどうすればよいでしょうか。たとえば、プロセッサ内でスリープ状態にした後でも、約 2 秒で 10 個の入力メッセージが完了します。