2012-06-04 30 views
5

我正在創建一個應用程序,其中有多個階段 - 每個階段的消息發送到我的隊列中的亞馬遜簡單工作流程(SWF)...應用程序應該爲每條收到的消息啓動一個新的線程。java-如何不斷等待事件發生

如何實現等待部分 - 以便應用程序不斷掃描隊列中的新消息並在收到消息時採取行動?

回答

0

您可以執行的一種方法是pollqueue,直到您在while loop機制中收到新消息爲止。只要您收到新消息,就可以調用自己的操作。

+0

輪詢是一個相當醜陋的做法,IMO。如果應用程序不是經常忙碌(即:每次調查都沒有收到消息),則阻止解決方案會更好。 – cHao

+0

@cHao,雖然我承認它有一些缺點,但仍有很多應用程序仍然有效地使用輪詢技術。 – UVM

+0

@UnniVMana我的應用程序每秒可能會收到多達50個以上的郵件 - 輪詢我的方案的一個很好的解決方案?是否有任何上限(即每秒接收到的最大消息數量)超過該上限,輪詢不是有效/有用的?謝謝... – Arvind

0

使用一個ServerSocket:

serversocket

特別

的。接受()方法等待有人需要連接。然後你可以實例化一個新的線程,傳遞需要的參數來保持連接(地址,端口等)。

2

你問被稱爲生產者 - 消費者模式什麼 你可以讀到它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(); 
    } 
} 
+0

我的應用程序是一個Web應用程序,它既是生產者又是消費者 - 您的答案仍適用於我的場景嗎?謝謝...... – Arvind

+0

絕對。它是適用於任何服務器 - 客戶端場景的模型。消費者就是客戶,它應該等待你機器上發生的事件(例如,另一部分代碼執行內容++; available = true;) –

+0

+1。我會讓'contents'成爲一個java.util.concurrent.ConcurrentLinkedQueue來處理一大堆消息,但是隻有它按原樣正常工作。 – RalphChapin

2

BlockingQueue及其實施LinkedBlockingQueue可以在這裏很有用。

Thread將通過調用

queue.take() 

和隊列將是空想從隊列take的東西,這樣的線程將等待,直到其他線程調用

queue.put(something). 

也把東西放到隊列如果隊列已滿,則queue.put()將使線程等待,直到新元素的隊列中將有空間。