我正在试图找到一个答案,如何通知EMS发布者在订阅者失败的情况下。在发布者->EMS服务器->订阅者的情况下,如果订阅者失败,我需要通知发布者采取纠正措施。我不关心耐用性/性能,我的意义在于时间。在交易系统中,如果我向订阅者发送市场订单,而订阅者又将其发送到交易所,如果失败,我需要让我的发布者将不同主题的消息发布到另一个Sunscriber(另一个交易所)。任何想法都是值得感谢的。
发布于 2011-05-07 08:08:52
tibjmsadmin.jar库包含用于检测订阅服务器何时断开连接的方法。比编写代码更简单,您可以:
然而,这些对发布者进行故障转移的“监视”方法有一个严重的问题--在您检测订阅者故障并重定向发布者所需的时间内,一些消息可能会通过并卡在失效队列中。你不会看到这种情况发生在任何1000万美元的交易上!
EMS知道用户何时连接,您应该利用这一点。
使用“分布式队列”,应该不需要在应用程序中编写逻辑,以便在失败时切换到新的订阅者。这在没有消息丢失的情况下发生,并保持消息的顺序。将负载平衡和故障转移逻辑排除在代码之外以及JMS提供程序的管理设置中也是一种很好的体系结构实践。
基本上,您将多个订阅者设置为一个队列(每个交换由一个订阅者表示)。EMS的默认操作是以循环方式在订阅者之间进行消息负载平衡。但您可以将队列设置为“独占”,以便消息一次只发送给一个订阅者。然后,如果该活动订户失败,则将消息转发给另一个订户。
有关所有这些主题的更多详细信息,请参阅EMS手册。
发布于 2011-05-07 07:18:49
不确定您是否有访问权限,您可以尝试在QueueInfo或TopicInfo中查看ReceiverCount或ConsumerCount -我相信您需要tibjms.admin包。也许你可以在发布之前查询这个,然后有选择地发布?不确定开销是多少。
由于JMS的性质,AFAIK不会通过EMS代理传播任何事务状态(除非您使用XA事务-具有所有开销)或确认。I.e.acks总是在发布者和代理之间,消费者和代理之间。
如果失败了,你可以尝试一个单独的ack主题,角色颠倒,但失败的情况是超时-我不确定这是不是明智的。
如果您真的不关心订单去往哪个交换-为什么不将主题/队列设置为独占的,并让两个消费者都尝试消费-第一个成功的将处理所有消息-如果它死了,那么第二个(可能会定期重试-可能成功连接)。或者,允许两者都处理队列外的订单--记住,一条消息只会由一个消费者处理……
我真的看不到解耦消息总线在您的订单流中的优势...对我来说没有任何意义..
https://stackoverflow.com/questions/5915202
复制相似问题