2012-10-11 61 views
1

我不明白在使用JMS主题时如何处理错误消息。我有一个持久的JMS主题,拥有4个订阅者。我发送消息给主题。 3个用户成功消费该消息,其中一个失败。经过一些重试后,该消息被放入死信队列(DLQ)中。JMS:如何将DLQ中的消息重新传递给主题订阅者?

问题是,如何从那里继续。

  1. 如何找出哪个用户失败?

  2. 如何仅将消息重新发送给该订阅者?我不能再把它放到话题中,因为所有的用户都会得到它。

是否有一些最佳实践来处理这种情况?

如果那很重要,我使用GlassFish 3.1.2与openMQ。我宁愿使用不特定于实现消息传递提供程序的解决方案。

在此先感谢您的回答。 干杯 Arne

+0

您使用的消息致谢?如果没有,我想你可能需要重新考虑你的设计。可能你需要等待ACK,并根据这些变化逻辑 – maverick

+0

@maverick我看到Acknowledgements会解决问题1,有没有一种机制可以用来解决问题2? – Arne

+0

一旦在相当长的时间内没有收到ACK,并且如果没有支持存储和转发,那么创建一个简单的队列并重新尝试通过该队列的传递怎么办?似乎在这一点上解决方案变得像一个怪物,现在你必须关心的话题和队列。或者尝试一个手工制作的商店,并转发每个消费者?..只是我的两分钱.. – maverick

回答

1

那么,我不是很熟悉openmq,但很多jms提供者有能力将消息从主题转发到队列。因此,消息生产者将消息发送到主题,然后jms提供者将消息的单独副本转发给每个消费者的单独队列。每个消费者都有自己的DLQ。

有以下好处:

  1. SLA保证每个队列消费(例如,缓慢的消费者可以其他消费者,如果减速带独立的队列,这不是如此)。
  2. 不会有消费者可能会丢失消息(持久订阅的主题只会在您首次订阅此主题后才会发送消息)。
  3. 聚类的一些问题可以很容易地被解决(用户(MDB)的,以主题在集群环境中的规则将收到的消息多次节点的集群中的计数)
+0

谢谢你的回答。这确实可以解决问题。不幸的是,openMQ目前不支持存储和转发消息。但是[计划](http://mq.java.net/road-map.html)。由于我们计划使用集群,因此您描述的利益3对我们将来会非常有帮助。谢谢你的提示。 – Arne