2017-06-08 11 views
1

私はSpring Integrationを使用して、インバウンドチャネルアダプタを使用してRSSフィードを消費し、フィードをデータベーステーブルに書き込みます。Spring統合フィードインバウンドチャネルアダプタ重複エントリ

プロセスの停止/開始時にエントリが重複しないように、PropertiesPersistingMetadataStoreを有効にしました。二次的な対策として、データベーステーブルでは、フィードID /フィードエントリのリンク列全体に固有の制約もあります。

これは問題なく動作しているようですが、同じRSSフィードアイテムを再度挿入しようとしているDB例外エラーが発生していることがあります(すべてではありません)。

これらの重複エラーはどのような条件で発生しますか?

答えて

0

PropertiesPersistingMetadataStoreは、通常のアプリケーションシャットダウン時(Beanがアプリケーションコンテキストによってdestroy()になったとき)にのみその状態を維持します。

しかし、それはをあなたのフローの中で持続した後に呼び出すことができるので、Flushableを実装します。

dbトランザクションがコミット後の式@metadataStore.flush()でコミットした後に、transaction synchronizationを使用してストアをフラッシュできます。

また、Redisなどのより堅牢な永続ストアを使用することもできます。これは、各更新時に持続します。

+0

ありがとうございました。アプリケーションが正常にシャットダウンしているので、状態が持続すると仮定しますが、私はRedisを使用するために探し始める必要があることに同意します。 PropertiesPersistingMetadataStoreのドキュメントを見て、メタデータストアの最新の公開日付を使用しているように見えます。私は起こっていることがいくつかのフィードのためだと思う、公開された日付は更新されているので、なぜ再び表示されます。この場合、この例外を捕まえてDSLを使用してアイテムを更新するのは簡単ですか? – Swordfish

+0

errorChannelをポーラーに追加し、エラーフロー( 'ErrorMessage'のペイロードは' failedMessage'と 'cause'というプロパティを持つ' MessagingException'です)で更新を行うことができます。代わりに、['ExpressionEvaluatingRequestHandlerAdvice'](http://docs.spring.io/spring-integration/reference/html/messaging-endpoints-chapter.html#expression-advice)をjdbcアダプタのエンドポイント' adviceChain'に追加することもできます。 –

+0

私はhttps://jira.spring.io/browse/INT-1810を1日修正することを望みます...そして、このユースケースも満たされます。 –

関連する問題