2017-02-24 21 views
0

要件: JMSキュー(別のアプリケーションによって公開されている)からメッセージを取得し、JMSキューにメッセージを保持する必要があります。トランザクション全体にフロー全体が必要なので、メッセージをダウンストリームJMSキューに永続化できない場合は、アップストリームJMSキューから受信したメッセージを確認しないでください。 私の設定は、私は、このシナリオでJmsTransactionManagerを使用する必要があるか、設定で十分超えるべきですか1つのJMSキューから別のJMSキューに永続化するときにJmsTransactionManagerを使用する必要があります

<int-jms:message-driven-channel-adapter 
    id="MessageDrivenAdapter" channel=" jmsMessageChannel " destination="sourceDestination" 
    connectionFactory="CF1" 
acknowledge="transacted" 
    /> 

<int:channel id=" jmsMessageChannel " /> 
<int-jms:outbound-channel-adapter id="sendsomemsg" 
    channel=" jmsMessageChannel " destination=”finalDestination” 
    connectionFactory="CF2" 
    session-transacted="true" /> 

以下の通りです。私たちは重複したメッセージを扱うことができるので、私たちはXAトランザクションを必要としないと信じています。

答えて

2

あなたはいくつかの別々のトランザクションリソースを使用しているので、あなたは間違いなくここでXAトランザクションを必要としています。両方がJMSであっても、それはトランザクションを共有できるという意味ではありません。

OTOHの場合、ChainedTransactionManagerのようなソリューションと、2つのチェーン(JmsTransactionManager)をJMSリソースごとに1つ試してみることができます。

詳細情報は、デイブSyerのarticleです。

+0

これらのコンポーネントは同じ接続ファクトリを使用しています。 –

+0

接続ファクトリが異なります。コードを編集しました。したがって、JmsTransactionManagerを使用する必要があります – vjm

+0

いいえ、あなたが 'ChainedTransactionManager'を複雑にすると' JtaTransactionManager'やその他のXA実装が必要です。共有された単一の 'JmsTransactionManager'はあなたのケースでは機能しません。 –

0

他のスレッド(キューチャネル、タスクエグゼキュータ)にハンドオフしない限り、両方のコンポーネントが同じ接続ファクトリを使用している限り、アウトバウンド操作はインバウンドと同じトランザクションで実行されます - 基底のJmsTemplateアウトバウンド・アダプターの中で、リスナー・コンテナがメッセージを配信したのと同じセッションを使用します。

+0

接続ファクトリが異なります。コードを編集しました。だから、JmsTransactionManagerを使用する必要があります – vjm