2

私は次のことを行うPOCに取り組んでいます

  1. メッセージ駆動型チャネルアダプタを使用して、トランザクションでメッセージを受信します
  2. ハンドラーを使用してアダプターから受信したメッセージをDBに挿入し、メッセージをアウトバウンド・チャネルに送信するServiceActivatorを呼び出します。

ここで、メッセージのDB挿入が失敗した場合、後で再試行できるように、JMSメッセージをキューに戻したいと思います。

以下の構成では機能しないようです(つまり、データベースへの挿入中にエラーが発生した場合でも、メッセージはキューから削除されます。

任意のポインタまたはサンプル構成が役立ちます。

<integration:channel id="jmsInChannel">         
    <integration:queue/>
</integration:channel>

<int-jms:message-driven-channel-adapter id="jmsIn"
    transaction-manager="transactionManager"
    connection-factory="sConnectionFactory"
    destination-name="emsQueue"
    acknowledge="client" channel="jmsInChannel"
    extract-payload="false"/>   

<integration:service-activator input-channel="jmsInChannel"
    output-channel="fileNamesChannel" ref="handler" method="process" />

<bean id="handler" class="com.irebalpoc.integration.MessageProcessor">
    <property name="jobHashTable" ref="jobsMapping" />
</bean>
4

1 に答える 1

5

Accept = "transacted"を設定すると、transactionManagerはJDBC(またはJTA)トランザクションマネージャーであると思います。

また、データベーストランザクションが同じスレッドで発生するように、JmsInChannelから<queue/>を削除する必要があります。

SpringはデータベーストランザクションをJMSトランザクションと同期します。

ただし、その影響については、http://www.javaworld.com/javaworld/jw-01-2009/jw-01-spring-transactions.htmlをお読みください。

サービスをべき等にすることができない場合は、XAトランザクションマネージャーを調べる必要があります。

于 2012-05-04T15:53:24.277 に答える