2016-12-08 6 views
0

をCOMMIT DBへの更新も失敗します。 DBへの更新が失敗すると、メッセージは複数回送信されます。Spring統合、JDBCを読んでAMQPメッセージを送信し、私がしようとしている

<int:channel id="output-channel" /> 
<int-jdbc:inbound-channel-adapter query="SELECT MAX(d) AS d FROM a" update="UPDATE a SET d=1 WHERE d=367" 
            channel="output-channel" data-source="dataSource"> 
    <int:poller fixed-rate="50000" max-messages-per-poll="1"> 
     <int:transactional transaction-manager="dataSourceTransactionManager2" /> 
    </int:poller> 
</int-jdbc:inbound-channel-adapter> 
<int-amqp:outbound-channel-adapter channel="output-channel" exchange-name="nameex" amqp-template="rabbitTemplate" /> 

この設定でわかるのは、UPDATEの失敗時にメッセージがまったく送信されないことです。 outbound-channel-adapterの呼び出しは更新後です。

もう1つの質問 - 私はDBに何かがあることを知るたびにインバウンドチャネルアダプターをプログラムでトリガーする可能性がありますが、ポーラーを長時間待たないでください。

ありがとうございます!

+0

jdbcインバウンドアダプタの障害に関する例外情報を貼り付けてください。 – walsh

+0

このテストでは、テスト用に作成された更新クエリで、重複した主キーのみがスローされます。私はこれがスローされることを期待しますが、私はまた、メッセージがamqpに送られることを期待します。 –

答えて

1

amqp送信後に更新するには、outputChannel<publish-subscribe-channel/>にします。

amqp発信アダプタとJDBC発信アダプタ(またはゲートウェイ)を登録します。 amqpにはorder="1"、JDBCにはorder="2"を設定します。

+0

AMQPアダプタがメッセージを送信していない場合にJDBC送信アダプタがUPDATEを実行しないことを期待しているので、この場合、トランザクションはまったく必要ありません。 –

+0

正しい - 'ignore-failures'を' true'に設定しない限り、あるサブスクライバへの送信に失敗すると例外がスローされ、残りのサブスクライバはメッセージを取得しません。 –

0

1)jdbcアウトバウンドゲートウェイiの代わりにアダプターを使用します。

<int-jdbc:outbound-gateway> 

2)ポールを緩め、待ち行列を持たないチャネルを作成します。

関連する問題