2010-08-11 55 views

回答

1

我碰到的主要要求是消費者無法在主題上競爭單一消息。例如,我有一位發佈呼叫中心活動的客戶。幾個系統訂閱這些事件。其中一個系統是具有多個實例運行的實際呼叫路由應用程序。如果每個實例訂閱,則該呼叫被路由到所有這些實例。但是,如果將消息放入隊列並且所有實例消耗掉相同的隊列,則只有一個消息會接收消息,並且調用將轉至該運算符。如果發佈應用程序從主題轉換爲隊列,則呼叫中心可以正常工作,但所有其他訂閱者應用程序都不會收到該消息。

該解決方案(在WebSphere MQ中實現)是爲該主題創建管理訂閱並將消息傳遞到所有應用程序實例使用的隊列。所以生產者應用仍然是發佈者,所有動態訂閱者仍然獲得消息的副本,呼叫中心應用實例競爭每個發佈消息的單個實例。

此外,您不能在主題上使用瀏覽語義,而您可以在隊列中使用瀏覽語義。通過主題,您可以指定選擇器來過濾返回的消息,但這只是關於它。使用隊列可以瀏覽,重置瀏覽指針,然後瀏覽更多。

如果您將消息放在隊列中,但沒有消息接收消息,則消息將保持排隊。如果您向某個主題發送消息,並且沒有活動的訂閱者或持久訂閱,則該消息將被丟棄。因此,隊列中的消息自然是持久的,而主題上的消息可能會或可能不會。

從純粹的JMS角度來看,隊列和主題都是目的地的實例,如果您不嘗試瀏覽,它們可以互換。應用程序可能不知道它打開的目標是一個隊列還是一個主題,除非它在運行時使用instanceOf()來查找。