【问题标题】:How to stop HornetQ from attempting re-delivery如何阻止 HornetQ 尝试重新投递
【发布时间】:2018-10-21 14:23:41
【问题描述】:

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

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

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

有什么办法吗?

【问题讨论】:

    标签: java jms spring-jms hornetq


    【解决方案1】:

    在企业集成模式中,系统无法传递的消息有区别:Dead Letter Channel,在大多数 JMS 实现中作为死信队列实现,以及无效的消息:已传递但您的应用拒绝它们,因为它们是在逻辑层面无效。这些将转到特定的Invalid Message Channel

    因此,在您的情况下,在 DLQ 中,您会收到由于网络问题而无法在所有重新投递尝试后投递的消息。并且您应该定义一个无效消息队列,以发送您的应用认为无效的消息。

    【讨论】:

      【解决方案2】:

      有趣的想法。我很确定这不受支持。如果您回滚,则应用重新传递设置并且如果您提交,则消息被消耗。

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

      缺点(复杂性除外)是内部事务可能会提交而外部事务由于某种原因而失败。在这种情况下,你会得到重复,所以你需要确保你可以处理它。

      【讨论】:

      • 谢谢 - 我有一种预感,我想要的东西是不可能的。我希望我不必手动发布到 DLQ - 这有点不对劲。也许我根本无法从我的主队列重新交付,然后通过将它们转发到第二个“重新交付队列”来处理瞬时故障。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-04-23
      • 2016-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-04
      • 2013-11-17
      相关资源
      最近更新 更多