如果订户失败,TIBCO EMS会通知发布者

时间:2011-05-06 17:57:10

标签: java c++ jms tibco ems

我正在尝试找到如何在订阅服务器发生故障时通知EMS发布者的答案。 在发布商 - > EMS服务器 - >订阅者的情况下,如果订阅者失败,我需要通知发布者采取纠正措施。我不会对durabilty / PERSIETENCE感到困扰,我的意义是时间。在交易系统中,如果我将市场订单发送给订阅者,订阅者又将其发送到交易所,如果失败,我需要让我的发布者将不同主题的消息发布给另一个Sunscriber(另一个交易所)。 任何想法都表示赞赏。

2 个答案:

答案 0 :(得分:3)

tibjmsadmin.jar库包含检测订户何时断开连接的方法。比编写代码更容易,您可以:

  • 如果你有Hawk,请使用 tibjmsadmin.hma写一个Hawk规则 如果是订户 断开连接,或
  • 在监视器上听 话题 $ sys.monitor.connection.disconnect - 消息正文告诉你 哪个用户断开连接。

然而,这些“监控”方法对发布者进行故障排除存在严重问题 - 在您检测到订阅者失败并重定向发布者所需的时间内,某些消息可能会通过并停留在已解散的队列中。你不会在任何1000万美元的交易中发生这种情况!

EMS知道订户何时连接,您应该利用这一点。

使用“分布式队列”,不应该在应用程序中编写逻辑代码,以便在失败时切换到新订阅者。这种情况发生时没有消息丢失并维持消息的顺序。在您的代码和JMS提供程序的管理设置中保持负载平衡和故障转移逻辑也是一种很好的架构实践。

基本上,您为队列设置了多个订户(每个订户由订户代表)。默认操作将是EMS以循环方式在订阅者之间对消息进行负载平衡。但您可以将队列设置为“独占”,以便消息一次只发送给一个订户。然后,如果该活动订户失败,则将消息转发给另一个订户。

有关所有这些主题的更多详细信息,请参阅EMS手册。

答案 1 :(得分:1)

不确定您是否有权访问,您可以尝试在QueueInfo或TopicInfo中查看ReceiverCount或ConsumerCount - 我相信您需要tibjms.admin包。您可以在发布之前查询这个,然后有选择地发布吗?不知道开销是多少。

由于JMS的性质,AFAIK没有事务状态(除非您使用XA事务 - 具有所有这些开销)或确认将通过EMS代理传播。 I.e.ack始终在发布者和经纪人以及消费者和经纪人之间。

如果不能解决上述问题,你可以尝试一个单独的ack主题,其角色可以反转,但失败的情况是超时 - 我不确定这是否合理。

如果你真的不关心订单进行的交换 - 为什么不让主题/队列独占并让两个消费者都试图消费 - 第一个成功的将处理所有消息 - 如果它消失了,那么第二个(可能会定期重试 - 可能会成功连接)。或者允许两个处理队列中的订单 - 记住一条消息将只由一个消费者处理......

我真的看不到订单流中的解耦消息总线的优势......对我来说毫无意义..