DelayQueueの実際の使用法は何ですか?解決するために設計された一般的な問題は何ですか?
DelayQueueの実際の使用法は何ですか?解決するために設計された一般的な問題は何ですか?
回答:
このクラスは、複数の遅延イベントを適切な順序で処理するスレッドに最適です。
たとえば、100個のライトが点滅しているディスプレイがあり、すべてのライトが無関係な速度で点滅しているとします。ライトごとにスレッドを作成することも、このクラスを使用してすべてのライトを1つのスレッドで調整することもできます。これは次のように動作します:
Light
フラッシュレートのあるクラスがありますDelayed
たとえば、光を指すインターフェイスの実装を作成しますLightFlash
DelayQueue
、LightFlash
ライトごとに新しいライトを追加します。ライトのフラッシュレートに適した遅延を設定しますDelayQueueは、処理する次のイベントを取得します。
私が考えることができる2つの実世界の例:
遅延は、キュー自体ではなく、キューに入る要素に関連付けられていることに注意してください。キューに入るオブジェクトには、遅延がゼロになるものもあれば、はるかに長い遅延を持つものもあります。
http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/Delayed.html
これを念頭に置いて、いくつかのユースケースを考えることができます。ただし、メッセージングフローに関してはおそらく脆弱であり、少しコードの匂いがするでしょう。特定の状況を除いて、それらすべての代替を使用します。
1)制御フロー-注文の処理には60秒かかることがわかっているため、オブジェクトが少なくとも60秒間存在するまで、キューから次の注文を読み取らないでください。
2)メッセージフロー-2つまたは3つの外部サービスにリクエストを送信し、ジョブの最初のバッチが少なくとも完了する可能性があることがわかったら、N秒後に注文を処理するために次のタスクをリリースする非同期システム。
3)メッセージのバッチ処理-特定の種類の注文はバースト的である可能性があるため、最後のN秒間に受信した注文を処理しないようにして、同様の注文がすぐに来るかどうかを確認します。
4)メッセージの優先順位-異なるメッセージまたは異なる顧客は、低遅延またはゼロ遅延でわずかに高いサービス品質を得ることができます。
場合によっては、キューに配置するオブジェクトは、デキューの準備が整う前に、一定時間そのキューに存在する必要があります。これは、BlockingQueueインターフェースを実装するjava.util.concurrent.DelayQueueクラスを使用する場所です。DelayQueueでは、指定された時間キューオブジェクトがキューに常駐する必要があります。
実際の使用例については、devxサイトのMinding the Queueの記事をご覧ください。
...これを説明するために私が考えた現実世界の例(お腹がすいたかもしれません)にはマフィンが含まれます。まあ、マフィンオブジェクト(私たちはJavaを話しているので、コーヒーしゃれを意図していません)。Muffinオブジェクトを配置するDelayQueueがあるとします...本質的に、getDelayメソッドは、オブジェクトがDelayQueueに保持されるまでの時間を示します。このメソッドによって返される数値がゼロまたはゼロより小さくなると、オブジェクトは準備ができ(この例ではベイク処理され)、デキューできるようになります...
完全に調理されていないマフィンを食べたくないので、推奨される調理時間の間、マフィンをDelayQueueに配置します...