我在设计将在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上安装用户将是最好的选择。但我不知道如何让它变得耐用/保证交付。
答案 0 :(得分:1)
来自Creating Robust JMS Applications
的引用5.2.1创建持久订阅
要确保发布/订阅应用程序收到所有已发布的消息,请为发布者使用PERSISTENT交付模式。此外,为订阅者使用持久订阅。
TopicSession.createSubscriber方法创建一个非持久订阅者。非持久订阅者只能接收在活动时发布的消息。
以更高的开销为代价,您可以使用 TopicSession.createDurableSubscriber 方法创建持久订阅者。持久订阅一次只能有一个活动订阅者。
[...]
通过设置以下内容,您可以建立持久订阅者的唯一身份:
- 连接的客户端ID
- 订阅者的主题和订阅名称
我已经使用JBoss 7进行了一些测试
topicSession.createDurableSubscriber(topic, subscriptionName);
并且JMS服务器正确缓冲每个断开连接的订户的消息。