我正在創建一個應用程序,其中有多個階段 - 每個階段的消息發送到我的隊列中的亞馬遜簡單工作流程(SWF)...應用程序應該爲每條收到的消息啓動一個新的線程。java-如何不斷等待事件發生
如何實現等待部分 - 以便應用程序不斷掃描隊列中的新消息並在收到消息時採取行動?
我正在創建一個應用程序,其中有多個階段 - 每個階段的消息發送到我的隊列中的亞馬遜簡單工作流程(SWF)...應用程序應該爲每條收到的消息啓動一個新的線程。java-如何不斷等待事件發生
如何實現等待部分 - 以便應用程序不斷掃描隊列中的新消息並在收到消息時採取行動?
您可以執行的一種方法是poll
queue
,直到您在while loop
機制中收到新消息爲止。只要您收到新消息,就可以調用自己的操作。
你問被稱爲生產者 - 消費者模式什麼 你可以讀到它here
的基本思想是:該網站是一個製片人,你是作爲一個客戶端消費者。
你等待(),直到聽衆收到一條消息,然後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();
}
}
我的應用程序是一個Web應用程序,它既是生產者又是消費者 - 您的答案仍適用於我的場景嗎?謝謝...... – Arvind
絕對。它是適用於任何服務器 - 客戶端場景的模型。消費者就是客戶,它應該等待你機器上發生的事件(例如,另一部分代碼執行內容++; available = true;) –
+1。我會讓'contents'成爲一個java.util.concurrent.ConcurrentLinkedQueue來處理一大堆消息,但是隻有它按原樣正常工作。 – RalphChapin
BlockingQueue
及其實施LinkedBlockingQueue
可以在這裏很有用。
當Thread
將通過調用
queue.take()
和隊列將是空想從隊列take
的東西,這樣的線程將等待,直到其他線程調用
queue.put(something).
也把東西放到隊列如果隊列已滿,則queue.put()
將使線程等待,直到新元素的隊列中將有空間。
輪詢是一個相當醜陋的做法,IMO。如果應用程序不是經常忙碌(即:每次調查都沒有收到消息),則阻止解決方案會更好。 – cHao
@cHao,雖然我承認它有一些缺點,但仍有很多應用程序仍然有效地使用輪詢技術。 – UVM
@UnniVMana我的應用程序每秒可能會收到多達50個以上的郵件 - 輪詢我的方案的一個很好的解決方案?是否有任何上限(即每秒接收到的最大消息數量)超過該上限,輪詢不是有效/有用的?謝謝... – Arvind