2013-08-25 41 views
0

我在設計將在JBoss ESB上運行的發佈/訂閱服務時遇到問題。我需要能夠發佈消息給一個主題,這個主題可能有200個訂閱者會聽,而且他們會在收到消息後對這個消息做些什麼。我正在撰寫發佈服務和示例訂閱服務,以展示如何完成這項工作。在JBoss ESB中發佈訂閱者設計並保證交付

我需要保證交付給這些訂閱者。如果他們在一段時間內脫機並且在該時間內發佈消息,當他們重新聯機時,需要交付這些消息。所以我認爲這意味着他們需要成爲持久用戶(我的理解是主題不耐用,但用戶被定義爲耐用)。

我現在有一個發佈服務,它將ESB消息粘貼到ESB Aware Queue上,ESB Aware Queue調用NotifyTopic,它在ESB-Unaware主題上粘貼消息。我有一個擁有ESB-Unaware主題監聽器的訂閱者,並且使用httprouter調用webservice,它將消息發送給我的web服務進行處理。這一切都有效 - 除非我的web服務處於脫機狀態(我必須弄清楚如何處理該情況,但我還沒有),或者如果我的ESB訂閱服務處於脫機狀態(我通過卸載它進行測試,發送一個很少發佈消息,並重新安裝它 - 沒有積壓的消息發送到我的web服務)。

我很確定我沒有正確地建立用戶。我認爲我需要訂閱者部署在ESB上。我不確定它是如何工作的,否則它將如何部署在不同的服務器上,然後仍然連接到ESB(試圖避免混淆SSL,防火牆,端口等)。我認爲在ESB上安裝用戶將是最好的選擇。但我不知道如何讓它持久/有保證交付。

回答

1

引自Creating Robust JMS Applications

5.2.1創建持久訂閱

要確保發佈/訂閱應用程序接收所有發佈的消息,請爲出版商持久傳遞模式。另外,爲用戶使用持久訂閱。

TopicSession.createSubscriber方法創建一個非持久訂閱者。非持久訂閱者只能接收在活動時發佈的消息。

以較高的開銷爲代價,您可以使用TopicSession.createDurableSubscriber方法創建一個持久訂閱者。持久訂閱一次只能有一個活動用戶。

[...]

可以通過設置建立持久訂閱獨特的身份如下:

  • 爲用戶
連接
  • 主題和訂閱名稱的客戶端ID
  • 我已經使用JBoss 7運行了一些測試

    • 我已經設置在連接工廠級別
    • 客戶端ID爲每三個用戶使用不同的訂閱名稱:
    topicSession.createDurableSubscriber(topic, subscriptionName); 
    

    和JMS服務器緩存爲每個斷開消息用戶正確。

    +0

    如果訂戶有不同的clientId,我不能有多個? – Michaela

    +0

    @Michaela對不起,我解釋了引用的文本不正確。所以是的,它似乎工作:*相同*客戶端ID,但*不同*訂閱名稱具有唯一的身份。 – Beryllium