在JBoss ESB中发布订阅设计,保证交付

时间:2013-08-25 01:37:48

标签: jms jboss-esb jms-topic

我在设计将在JBoss ESB上运行的发布/订阅服务时遇到问题。我需要能够向一个主题发布消息,这个主题可能有200个订阅者正在收听,并且一旦获得该消息,他们就会对该消息执行某些操作。我正在编写发布服务和示例订阅服务,以展示如何完成它。

我需要保证向这些订阅者提供服务。如果他们离线一段时间,并且消息在该时间内发布,当他们重新联机时,需要传递这些消息。所以我认为这意味着他们需要是持久的订阅者(我的理解是主题不耐用,但订阅者被定义为持久)。

我现在有一个发布服务,它将ESB消息粘贴在ESB Aware Queue上,该队列调用NotifyTopic,它将消息粘贴在ESB-Unaware主题上。我有一个订阅者,它有一个ESB-Unaware主题的监听器,它使用httprouter调用web服务,httprouter将消息发送给我的webservice处理。这一切都有效 - 除非我的webservice离线(我必须弄清楚如何处理那个场景,但我还没有),或者我的ESB Subscriber Service离线(我通过卸载测试,发送一个很少发布消息,并重新安装它 - 没有积压的消息被发送到我的webservice)。

我很确定我没有正确构建订阅者。我以为我需要将订户部署在ESB上。我不确定它将如何工作,否则它将如何部署在不同的服务器上,然后仍然连接到ESB(试图避免混淆相互的ssl,防火墙,端口等)。我认为在ESB上安装用户将是最好的选择。但我不知道如何让它变得耐用/保证交付。

1 个答案:

答案 0 :(得分:1)

来自Creating Robust JMS Applications

的引用
  

5.2.1创建持久订阅

     

要确保发布/订阅应用程序收到所有已发布的消息,请为发布者使用PERSISTENT交付模式。此外,为订阅者使用持久订阅。

     

TopicSession.createSubscriber方法创建一个非持久订阅者。非持久订阅者只能接收在活动时发布的消息。

     

以更高的开销为代价,您可以使用 TopicSession.createDurableSubscriber 方法创建持久订阅者。持久订阅一次只能有一个活动订阅者。

     

[...]

     

通过设置以下内容,您可以建立持久订阅者唯一身份

     
      
  • 连接的客户端ID
  •   
  • 订阅者的主题和订阅名称
  •   

我已经使用JBoss 7进行了一些测试

  • 我在连接工厂级别设置了客户端ID
  • 为三个订阅者中的每一个使用不同的订阅名称:
topicSession.createDurableSubscriber(topic, subscriptionName);

并且JMS服务器正确缓冲每个断开连接的订户的消息。