0

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&amp;waitForTaskToComplete=Never&amp;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&amp;waitForTaskToComplete=Never&amp;purgeWhenStopping=true" />
    <camel:transacted ref="propagationReqd" />
    <camel:process ref="msgProcessor" />
    <camel:to uri="{{final.queue}}" />
</camel:route>

誰かが私が間違っていることを指摘できたら感謝しますか?

前もって感謝します。

4

2 に答える 2

1
  1. このエラーは、Solace セットアップ接続ファクトリの構成の問題のように聞こえます。

  2. 参考までに: seda エンドポイントは、非同期であるため、トランザクションでは当てにできません。

  3. すべてのステップでトランザクションが本当に必要な場合は、メッセージを seda エンドポイントではなく別の solace キューに戻します。

于 2016-10-06T16:43:44.320 に答える
1

JMS トランザクションを作成できませんでした。ネストされた例外は com.solacesystems.jms.ConfigurationException です: トランザクション セッションまたは XA セッションは直接転送ではサポートされていませ

Solace は、ダイレクト トランスポートが有効になっている JMS 接続ファクトリを使用するトランザクションを許可しません。これが例外の原因です。

ここでの解決策は、msgProcessorBean が使用する接続ファクトリでダイレクト トランスポートを無効にして、トランザクションがこの例外を取り除けるようにすることです。

シーケンサーによって例外が発生した場合、メッセージは in.solace.queue に保持されますが、メッセージがステージング キューから SEDA、msgProcessor Bean に渡され、次の例外がスローされると失われます。

http://camel.apache.org/seda.htmlから、SEDA はリカバリ/トランザクションをサポートしていないようです。

このコンポーネントは、メッセージがまだ処理されていない間に VM が終了した場合、いかなる種類の永続化または回復も実装しません。永続性、信頼性、または分散型 SEDA が必要な場合は、JMS または ActiveMQ を使用してみてください。

于 2016-10-07T01:11:05.403 に答える