2012-07-10 288 views
0

我正試圖在java中編寫生產者 - 消費者模式。我是通過一系列不同的連接連接到許多服務器的網絡客戶端。服務器產生不同的'工作'數據包,所有這些數據包都被放入一個阻塞隊列。我想要做的就是阻止我的消費者,只有特定類型的工作包才能交付給特定的消費者。消費者過濾的生產者 - 消費者阻塞隊列

實施例:

  • 阻擋隊列填充有三種不同類型的工作包對象:A,B,C
  • 兩個消費者正在等待工作包對象。消費者1只想要類型A,而消費者2只需要類型B或C

java.util中是否存在一些標準類...還是必須滾動我自己的類?另外,如果需要,最好的方法是什麼?

在此先感謝!

安德魯Klofas

+2

您需要阻塞隊列和消費者之間的某些東西將數據包「路由」到正確的消費者。或者,您可以爲每個使用者分配自己的阻塞隊列,並根據數據包類型填充隊列。 – 2012-07-10 22:43:06

+0

爲什麼要使用一個阻塞隊列?還是存在着不確定數量的「工作類型」? – 2012-07-10 22:44:15

+0

有不確定數量的類型。我想要做的是有一些專門的消費者對特定的工作類型做出反應,然後是一個全能的消費者。 – 2012-07-10 22:46:51

回答

1

沒有java.util中做到這一點的標準方式,但這裏有一個簡單的設計:

我假設A,B,C都實現接口d和使用Bs和Cs無序處理A並不重要。

讓一組「排序消費者」擁有一個「輸入」BlockingQueue。這些使用者確定隊列中對象的類型,並將它們提供給您的真實工作人員從中分離出來的特定於類型的「輸出」隊列。是否有一些限制要求您只有一個隊列?

2

您可以通過標準JMS獲得此行爲。您的生產者創建放置在JMS主題上的消息。消費者使用已過濾的訂閱來訂閱該主題:這樣,訂閱者X僅獲得類型X消息。 (更多關於API的訂閱)

持久的用戶將得到你所要求的每個用戶的排隊消息。

這是一個pub/sub模型。