0

我在设计将在 JBoss ESB 上运行的发布/订阅服务时遇到问题。我需要能够将消息发布到一个主题,大概有 200 个订阅者会收听,一旦他们收到消息,他们就会对消息做一些事情。我正在编写发布服务和一个示例订阅服务来展示它是如何完成的。

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

我现在有一个发布服务,它将 ESB 消息粘贴到 ESB Aware Queue 上,该队列调用 NotifyTopic,它将消息粘贴到 ESB-Unaware Topic 上。我有一个订阅者,它有一个 ESB-Unaware 主题的侦听器,它使用一个 httprouter 调用一个 web 服务,它发送消息以由我的 web 服务处理。一切正常 - 除非我的 web 服务处于脱机状态(我必须弄清楚如何处理这种情况,但我什至还没有),或者我的 ESB 订阅服务处于脱机状态(我通过卸载它进行测试,发送一个很少发布消息,然后重新安装它 - 没有积压的消息发送到我的网络服务)。

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

4

1 回答 1

1

创建健壮的 JMS 应用程序中引用

5.2.1 创建持久订阅

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

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

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

[...]

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

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

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

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

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

于 2013-08-25T09:25:00.463 回答