2012-05-10 80 views
0

在JMS中有隊列和主題。據我所知,到目前爲止,隊列最適用於生產者/消費者場景,其中主題可用於發佈/訂閱。但是在我的場景中,我需要一種方法來結合這兩種方法並創建一個生產者 - 消費者觀察者體系結構。JMS生產者 - 消費者觀察者(PCO)

特別是我有寫一些隊列和工人,從這些隊列中讀取並處理這些隊列中的郵件製作,然後將其寫入不同的隊列(或主題)。每當工作人員完成工作時,我的GUI應該被通知並更新其當前系統狀態的表示。由於工作人員和GUI是不同的過程,我不能應用簡單的觀察者模式或直接通知GUI。

什麼是實現這一目標的最佳方式使用隊列和/或主題的組合?應始終通知GUI,但不應占用隊列中的任何內容?

我想與JMS來解決這個而不是直接使用的任何其他技術,例如RMI實現觀察者的一部分。

爲了給出一個更具體的例子:

  1. 我有一個隊列與包(PACKAGEQUEUE)中,由機器產生(PackageProducer
  2. 我有一個工人,這需要包從PACKAGEQUEUE增加一個地址然後將它寫入MAILQUEUEAddressWorker
  3. 另一個工作人員處理MAILQUEUE並通過郵件(MailWorker)將包發送出去。
  4. 步驟2.當消息被寫入MAILQUEUE後,我要通知GUI並更新包的狀態。當然,GUI不應該使用MAILQUEUE中的消息,只有MailWorker必須消耗它們。

回答

1

您可以使用隊列和主題的組合爲您的解決方案。

你的GUI應用程序可以訂閱一個話題,說MAILQUEUE_NOTIFICATION。每次(即在步驟2)PackageProducer將消息寫入MAILQUEUE,該消息的副本應該發佈到MAILQUEUE_NOTIFICATION主題。由於GUI應用程序已訂閱了該主題,因此它將獲得包含有關程序包狀態信息的發佈。可以使用該出版物的內容更新GUI。

HTH

+0

謝謝,還有一個問題:是不是總是需要使用隊列和主題的組合,或者我可以爲例如改變'MAILQUEUE'成'MAILTOPIC',然後訂閱GUI和在MailWorker ?我目前沒有看到任何影響嗎? – lanoxx

+0

沒必要。您可以使用主題而不是隊列,並且GUI和MailWorker都訂閱該主題。在您的解決方案中,MailWorker將處理消息,而GUI將僅查看消息。 MailWorker必須創建持久訂閱,因爲即使它未運行,它也不應該錯過發佈。對於GUI,您可以選擇訂閱類型。 – Shashi

+0

我明白了,所以問題是,如果我將GUI和Worker同時訂閱到單個主題,並且其中一個未運行,則消息將丟失。雖然單獨的主題和隊列這不會發生。對? – lanoxx