如何阻止 HornetQ 尝试重新发送
How to stop HornetQ from attempting re-delivery
我有一个 java 客户端处理来自 HornetQ 的消息。由于临时网络问题,处理可能会失败,我通过抛出异常并配置队列尝试重新传递来处理。
但是,处理可能会由于其他原因而失败,这意味着不值得尝试重新投递。
现在,我可以通过 而不是 抛出异常并让客户端使用消息来阻止重新传递。但我不想这样做。我想要一些拒绝消息的方法,实际上是对队列说:"don't bother re-delivering this message - it can go straight to the dead-letter-queue".
有什么办法吗?
有趣的想法。我相当确定这不受支持。如果您回滚,则应用重新传送设置,如果您提交,则消息被消耗。
您可以做的是在新事务中处理消息。那要么成功,要么失败。如果失败,您可以检查异常并决定要做什么。如果您认为它是暂时的,您可以回滚 outer/original 事务并重新交付。如果你想让消息进入死信队列,你可以手动 post 它然后提交外部事务。这样,您还可以根据需要区分技术错误和功能错误的死信队列。
缺点(复杂性除外)是内部事务可能由于某种原因提交而外部事务失败。在那种情况下,您会得到重复的,因此您需要确保您可以处理它。
在企业集成模式中,系统无法传递的消息之间存在区别:Dead Letter Channel, implemented as Dead Letter Queue in most JMS implementations, and messages that are invalid: are delivered and your app rejects them because are invalid at a logical level. Those would go to a specific Invalid Message Channel
因此,在您的情况下,在 DLQ 中,由于网络问题,在所有重新投递尝试之后,您将无法投递那些邮件。并且您应该定义一个无效消息队列,以发送您的应用认为无效的消息。
我有一个 java 客户端处理来自 HornetQ 的消息。由于临时网络问题,处理可能会失败,我通过抛出异常并配置队列尝试重新传递来处理。
但是,处理可能会由于其他原因而失败,这意味着不值得尝试重新投递。
现在,我可以通过 而不是 抛出异常并让客户端使用消息来阻止重新传递。但我不想这样做。我想要一些拒绝消息的方法,实际上是对队列说:"don't bother re-delivering this message - it can go straight to the dead-letter-queue".
有什么办法吗?
有趣的想法。我相当确定这不受支持。如果您回滚,则应用重新传送设置,如果您提交,则消息被消耗。
您可以做的是在新事务中处理消息。那要么成功,要么失败。如果失败,您可以检查异常并决定要做什么。如果您认为它是暂时的,您可以回滚 outer/original 事务并重新交付。如果你想让消息进入死信队列,你可以手动 post 它然后提交外部事务。这样,您还可以根据需要区分技术错误和功能错误的死信队列。
缺点(复杂性除外)是内部事务可能由于某种原因提交而外部事务失败。在那种情况下,您会得到重复的,因此您需要确保您可以处理它。
在企业集成模式中,系统无法传递的消息之间存在区别:Dead Letter Channel, implemented as Dead Letter Queue in most JMS implementations, and messages that are invalid: are delivered and your app rejects them because are invalid at a logical level. Those would go to a specific Invalid Message Channel
因此,在您的情况下,在 DLQ 中,由于网络问题,在所有重新投递尝试之后,您将无法投递那些邮件。并且您应该定义一个无效消息队列,以发送您的应用认为无效的消息。