在JMS中有隊列和主題。據我所知,到目前爲止,隊列最適用於生產者/消費者場景,其中主題可用於發佈/訂閱。但是在我的場景中,我需要一種方法來結合這兩種方法並創建一個生產者 - 消費者觀察者體系結構。JMS生產者 - 消費者觀察者(PCO)
特別是我有寫一些隊列和工人,從這些隊列中讀取並處理這些隊列中的郵件製作,然後將其寫入不同的隊列(或主題)。每當工作人員完成工作時,我的GUI應該被通知並更新其當前系統狀態的表示。由於工作人員和GUI是不同的過程,我不能應用簡單的觀察者模式或直接通知GUI。
什麼是實現這一目標的最佳方式使用隊列和/或主題的組合?應始終通知GUI,但不應占用隊列中的任何內容?
我想與JMS來解決這個而不是直接使用的任何其他技術,例如RMI實現觀察者的一部分。
爲了給出一個更具體的例子:
- 我有一個隊列與包(
PACKAGEQUEUE
)中,由機器產生(PackageProducer
) - 我有一個工人,這需要包從
PACKAGEQUEUE
增加一個地址然後將它寫入MAILQUEUE
(AddressWorker
) - 另一個工作人員處理
MAILQUEUE
並通過郵件(MailWorker
)將包發送出去。 - 步驟2.當消息被寫入
MAILQUEUE
後,我要通知GUI並更新包的狀態。當然,GUI不應該使用MAILQUEUE
中的消息,只有MailWorker
必須消耗它們。
謝謝,還有一個問題:是不是總是需要使用隊列和主題的組合,或者我可以爲例如改變'MAILQUEUE'成'MAILTOPIC',然後訂閱GUI和在MailWorker ?我目前沒有看到任何影響嗎? – lanoxx
沒必要。您可以使用主題而不是隊列,並且GUI和MailWorker都訂閱該主題。在您的解決方案中,MailWorker將處理消息,而GUI將僅查看消息。 MailWorker必須創建持久訂閱,因爲即使它未運行,它也不應該錯過發佈。對於GUI,您可以選擇訂閱類型。 – Shashi
我明白了,所以問題是,如果我將GUI和Worker同時訂閱到單個主題,並且其中一個未運行,則消息將丟失。雖然單獨的主題和隊列這不會發生。對? – lanoxx