複数のステージがあるアプリケーションを作成しています。ステージごとに、Amazon Simple Work Flow (SWF) のキューにメッセージが送信されます。アプリは、受信したメッセージごとに新しいスレッドを開始する必要があります。
アプリケーションが新しいメッセージのキューを常にスキャンし、メッセージが受信された瞬間にアクションを実行するように、待機部分を実装するにはどうすればよいですか?
複数のステージがあるアプリケーションを作成しています。ステージごとに、Amazon Simple Work Flow (SWF) のキューにメッセージが送信されます。アプリは、受信したメッセージごとに新しいスレッドを開始する必要があります。
アプリケーションが新しいメッセージのキューを常にスキャンし、メッセージが受信された瞬間にアクションを実行するように、待機部分を実装するにはどうすればよいですか?
BlockingQueue
そしてその実装LinkedBlockingQueue
はここで役立ちます。
呼び出してキューThread
から何かをしたいときtake
queue.take()
キューが空になると、そのようなスレッドは、他のスレッドが呼び出して何かをキューに入れるまで待機します
queue.put(something).
また、キューがいっぱいの場合queue.put()
、キューに新しい要素用のスペースができるまでスレッドを待機させます。
あなたが尋ねていることは生産者消費者モデルと呼ばれ、ここでそれについて読むことができます
基本的な考え方: サイトは生産者であり、クライアントは消費者です。
リスナーがメッセージを受信するまでwait()してからnotifAll()
class WaitForAmazon{
private boolean available = false;
private int contents;
public synchronized int consumer() {
while (available == false) {
try {
wait();
} catch (InterruptedException e) { }
}
available = false;
notifyAll();
return contents;
}
public synchronized void producer(int value) {
while (available == true) {
try {
wait();
} catch (InterruptedException e) { }
}
contents = value;
available = true;
notifyAll();
}
}
できる 1 つの方法は、メカニズムで新しいメッセージを取得poll
するqueue
までです。新しいメッセージwhile loop
を取得したら、独自のアクションを呼び出すことができます。
サーバーソケットを使用します。
特に、.accept() メソッドは誰かが接続を要求するのを待ちます。次に、接続を維持するために必要なパラメーター (アドレス、ポートなど) を渡す新しいスレッドをインスタンス化できます。