java - JMS:如何将DLQ中的消息重新传递给主题订阅者?

标签 java jakarta-ee glassfish jms messaging

我不明白如何在使用 JMS 主题时处理错误消息。我有一个有 4 个订阅者的持久 JMS 主题。我向主题发送消息。 3 个订阅者成功消费消息,1 个失败。经过几次重试后,消息将被放入死信队列 (DLQ)。

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

  1. 如何找出失败的订阅者?

  2. 如何才能仅将消息重新传送给该订阅者?我不能再次将其放入主题中,因为那时所有订阅者都会收到它。

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

如果这很重要,我将 Glassfish 3.1.2 与 openMQ 一起使用。我更愿意使用不特定于消息传递提供程序实现的解决方案。

预先感谢您的回答。 干杯 阿恩

最佳答案

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

有以下好处:

  1. 为每个队列使用者提供有保证的 SLA(例如,缓慢的使用者可能会减慢其他使用者的速度,如果使用单独的队列则情况并非如此)。
  2. 消费者不会丢失消息(具有持久订阅的主题将仅在您首次订阅该主题后传送消息)。
  3. 一些集群问题可以轻松解决(集群环境中主题的订阅者 (MDB) 通常接收消息的次数与集群中节点的数量相同)

关于java - JMS:如何将DLQ中的消息重新传递给主题订阅者?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12843382/

相关文章:

java - 声明迭代器<?扩展 E & Comparable<? java 中的 super E>> 迭代器

java - 使用 com.fasterxml.jackson.databind.ObjectMapper 序列化接口(interface)字段

java - 如何使用 ExecutorService 等待所有线程完成?

java - 握手警报 : Unrecognized_name Liberty Profile

java - 如何在部署环境中调用批处理文件?

java - 安装 glassfish 服务器时出现 "application need 1.6 or higher version of java"错误?

java - 如何确定 protobuf 中的消息类型以便我可以使用该 type.parsefrom(byte[ ])

database - 将数据从关系数据库迁移到 NoSQL

java - 重新部署带有 cargo 的远程 glassfish 失败

java - 找不到媒体类型 MessageBodyWriter=Application/json,glassfish