Solace キューからメッセージをダウンロードするために Camel を使用していますが、トランザクション管理を理解するのに苦労しています。
フローは次のようになります。メッセージは Solace キューからダウンロードされ、いくつかのロジックに応じて多くの Solace キューの 1 つにプッシュされます (ステージングと呼ばれます)。これらのステージング キューから、メッセージは SEDA コンポーネントを使用してプロセッサ (Bean) にルーティングされ、最終的に別の Solace キューに送信されます。
トランザクションを次のように構成しました
<bean id="propagationReqd" class="org.apache.camel.spring.spi.SpringTransactionPolicy">
<property name="transactionManager" ref="jmsTransactionManager" />
<property name="propagationBehaviorName" value="PROPAGATION_REQUIRED" />
</bean>
シーケンサーによって例外が発生した場合、メッセージはin.solace.queueに保持されますが、メッセージがステージング キューから SEDA、msgProcessor Bean に渡され、次の例外がスローされると失われます。
JMS トランザクションを作成できませんでした。ネストされた例外は com.solacesystems.jms.ConfigurationException です: トランザクション セッションまたは XA セッションは直接転送ではサポートされていません
私の理解では、SEDA は物理キューではないため、例外がスローされるとメッセージが失われますが、ステージング Solace キューはそれを保持すると思いました。
ルーティング構成:
<camel:route id="msg.router">
<camel:from uri="{{in.solace.queue}}" />
<camel:transacted ref="propagationReqd" />
<camel:to uri="direct:msgSequencer" />
</camel:route>
<camel:route id="msg.processor">
<camel:from uri="direct:msgSequencer" />
<camel:transacted ref="propagationReqd" />
<camel:process ref="sequencer" />
<camel:choice>
<camel:when>
<camel:simple>${headers.MsgId} == '0'</camel:simple>
<camel:to uri="{{stage.solace.queue.0}}" />
</camel:when>
<camel:when>
<camel:simple>${headers.MsgId} == '1'</camel:simple>
<camel:to uri="{{stage.solace.queue.1}}" />
</camel:when>
...
...
...
</camel:choice>
</camel:route>
<camel:route id="msg.seda.0">
<camel:from uri="{{stage.solace.queue.0}}" />
<camel:transacted ref="propagationReqd" />
<camel:to uri="seda:processor.0" />
</camel:route>
<camel:route id="msg.seda.1">
<camel:from uri="{{stage.solace.queue.1}}" />
<camel:transacted ref="propagationReqd" />
<camel:to uri="seda:processor.1" />
</camel:route>
<camel:route id="msg.process.0">
<camel:from uri="seda:processor.0?concurrentConsumers=4&waitForTaskToComplete=Never&purgeWhenStopping=true" />
<camel:transacted ref="propagationReqd" />
<camel:process ref="msgProcessor" />
<camel:to uri="{{final.queue}}" />
</camel:route>
<camel:route id="msg.process.1">
<camel:from uri="seda:processor.1?concurrentConsumers=4&waitForTaskToComplete=Never&purgeWhenStopping=true" />
<camel:transacted ref="propagationReqd" />
<camel:process ref="msgProcessor" />
<camel:to uri="{{final.queue}}" />
</camel:route>
誰かが私が間違っていることを指摘できたら感謝しますか?
前もって感謝します。