Java 如何阻止HornetQ尝试重新交付

Java 如何阻止HornetQ尝试重新交付,java,jms,spring-jms,hornetq,Java,Jms,Spring Jms,Hornetq,我有一个java客户端,它处理来自HornetQ的消息。由于临时网络问题,处理可能会失败,我通过抛出异常并配置队列以尝试重新传递来处理这些问题 但是,由于其他原因,处理可能会失败,这意味着不值得尝试重新交付 现在,我可以通过不抛出异常并让客户端使用消息来防止重新传递。但我不想这么做。我想以某种方式拒绝该消息,实际上是对队列说:“不要麻烦重新传递此消息-它可以直接进入死信队列” 有什么办法可以做到这一点吗?这个主意很有趣。我相当肯定这是不受支持的。如果回滚,则应用重新交付设置,如果提交,则消息将被

我有一个java客户端,它处理来自HornetQ的消息。由于临时网络问题,处理可能会失败,我通过抛出异常并配置队列以尝试重新传递来处理这些问题

但是,由于其他原因,处理可能会失败,这意味着不值得尝试重新交付

现在,我可以通过不抛出异常并让客户端使用消息来防止重新传递。但我不想这么做。我想以某种方式拒绝该消息,实际上是对队列说:“不要麻烦重新传递此消息-它可以直接进入死信队列”


有什么办法可以做到这一点吗?

这个主意很有趣。我相当肯定这是不受支持的。如果回滚,则应用重新交付设置,如果提交,则消息将被使用

您可以做的是在新事务中处理消息。这要么成功,要么失败。如果失败,您可以检查异常并决定要执行的操作。如果您认为它是暂时的,您可以回滚外部/原始事务并获得重新交付。如果希望消息进入死信队列,则可以手动发布消息,然后提交外部事务。这样,如果愿意,还可以区分技术错误和功能错误的死信队列


缺点(复杂性除外)是内部事务可能会提交,而外部事务由于某种原因会失败。在这种情况下,您将得到重复的消息,因此您需要确保能够处理这些消息。

在企业集成模式中,系统无法传递的消息之间存在区别:,在大多数JMS实现中实现为死信队列,和无效消息:被传递,并且您的应用程序拒绝它们,因为它们在逻辑级别无效。这些将去一个特定的地方


因此,在您的情况下,在DLQ中,由于网络问题,在所有的重新交付尝试之后,您将无法传递这些消息。您应该定义一个无效消息队列,以发送应用程序认为无效的消息。

谢谢-我有一种预感,我想要的是不可能的。我希望我不必手动发布到DLQ——这感觉有点不对。也许我根本无法从我的主队列重新传递,然后通过将它们转发到第二个“重新传递队列”来处理暂时性故障。