例外によってトランザクションがロールバックされた場合にメッセージが再配信されるように、トランザクション ポーラー (Spring 3.1.2 および Spring-Integration 2.2.3) があります。
<int:outbound-channel-adapter id="obca" ref="notificationHandler"
method="handle" channel="notificationChannel" >
<int:poller max-messages-per-poll="100" fixed-delay="6000"
time-unit="MILLISECONDS">
<int:transactional isolation="DEFAULT" />
</int:poller>
</int:outbound-channel-adapter>
これは、H2 データベースを使用した単体テスト時に正常に機能し、メソッドが例外をスローする限り、メッセージは再配信されます
@Transactional
public void handle(Message<MyPayload> message)
しかし、本番環境で使用するSQLサーバー(重要な場合はREAD COMMITTED SNAPSHOTを分離レベルとして使用するms-sqlserver)を使用すると、例外の再配信が機能しません。これがなぜであるかのヒントはありますか?
編集:
TRACE ログでテストしましたが、疑わしいログ メッセージを見つけることができませんでした。最終的に動作するようになりました。通常の org.springframework.orm.jpa.JpaTransactionManager の代わりに、別個の dataSource (通常のデータベースと同じ構成) と transactionManager org.springframework.jdbc.datasource.DataSourceTransactionManager を宣言しました。