6

みなさん、こんにちは。

特定のオブジェクトが変更されるたびに、別のシステム (ターゲット) に非同期的に通知する必要があるシステム (ソース) があります。ねじれは、ソース システムが単一のオブジェクトを短い間隔で何度も変更する可能性があることです (更新は非常に「バースト的」です)。その場合、ターゲット システムに 1 回だけ通知し、最終状態を物体。

私が考えたのは、ThreadPoolExecutor の前にある種の遅延型重複排除キューを使用することでした。このキューは次のようになります。

  1. 最小限の時間、アイテムをキューに保持します (理想的には、突然変異の典型的なバーストの期間よりもわずかに長くなるように構成されます)。

  2. (オブジェクトの識別子によって定義された) 重複がキューに入れられた場合に、既存のオブジェクトを置き換えます。ただし、アイテムはキュー内の元の位置を保持する必要があります (1 つのアイテムがキューの最後に永続的に押し付けられるのを避けるため、別のアイテムが一時的に発生する場合でも、ある時点で通知を送信する必要があります)。

java.util でこれとまったく同じものを見たことがなく、この領域での私の google-fu は特に弱いようです。

誰かがこれを以前に実装したことがありますか、このように動作する BlockingQueue 実装を知っていますか、または実装方法についてのヒントがありますか?

前もって感謝します!

ピーター

PS。ESB がこの種のことを行うことは知っていますが、この場合、それは重すぎるアプローチです。理想的には、ソース システムに新しいライブラリの依存関係をまったく追加したくないのです。

4

2 に答える 2

4

あなたの最善の策は、拡張ArrayBlockingQueueしてオーバーライドofferpoll、時間遅延機能を追加することだと思います。特に方法ArrayBlockingQueueがあるからcontainsです。

別のアイデアは、DelayQueueオーバーライドofferして古い要素を削除し、新しい要素を挿入するが、古い時間遅延を保持することです。これにより、本質的に順序が保持されます。次に、キュー アイテムをDelayedインターフェイスでラップする必要があります。

于 2011-05-29T06:27:54.947 に答える
0

変更が発生したことのみをシステムに通知し、他のシステムに新しい状態を取得させることができます。次に、状態がフェッチされるまで、それ以上の変更を通知しません。

于 2011-05-29T06:22:28.513 に答える