【问题标题】:Java JMS - Send message to Dead Letter Queue explicitlyJava JMS - 将消息显式发送到死信队列
【发布时间】:2022-02-19 01:23:55
【问题描述】:

有没有办法明确告诉代理向队列分配的死信队列发送消息?

我知道我们可以配置一个队列以在一定次数的重新传递尝试后自动将消息发送到 DLQ。这对于数据库问题、网络问题等临时错误非常有意义。但是,在业务规则错误的情况下,让该消息在 X 分钟内尝试重新传递 X 次是没有意义的。当我们知道这是违反业务规则/格式错误的消息等时发送到死信队列。

我希望有一种方法,当我们发现违反业务规则时,我们可以立即将其发送到该队列死信队列。我知道我可以显式地编写代码将其发送到死信队列,但我们将有许多(数十个)可配置队列,并且它们相关的死信队列将由我们的中间件团队配置。我不想明确编码死信队列队列名称,甚至在我自己的属性中配置它们。我希望有一种简单的方法可以告诉代理立即将消息发送到死信队列而不是尝试重新传递。

看起来应该是message.deadLetter()。我觉得我一定遗漏了一些简单的东西,但我在消费者、会话或消息上看不到任何类似的机制。

【问题讨论】:

    标签: java queue jms dlq


    【解决方案1】:

    对于您在 JMS 规范中描述的功能没有任何调整。 JMS 规范通过JMSRedelivered 标头和JMSXDeliveryCount 属性等方式结合了重新传递。然而,它实际上并没有提到“死信”目的地。

    也就是说,这样的功能可能由特定的 JMS 代理提供,但是由于您没有提及您正在使用的 JMS 代理实现,因此无法确定您选择的代理是否实现了这样的功能一个特征。在任何情况下,它都将通过特定于实现的机制进行配置和/或调用,根据定义,该机制在代理之间是不可移植的,并且无法从 JMS API 获得。

    【讨论】:

    • 感谢贾斯汀的确认。我很惊讶这不存在。无论如何,在 JMS 中以编程方式找到与队列关联的死信队列吗?这样我就可以自己移动消息了。由于队列的配置和控制由单独的团队管理,我无法对 DLQ 做出任何假设。我必须能够以编程方式查找它。我查看了 JMS API,也看不到这样做,但我只是想确认我没有遗漏任何简单的东西。
    • 我同意这样的功能是有意义的,但 JMS 只是不支持它。如前所述,该规范不涵盖“死信”目的地。规范中没有规定将“死信”目的地与另一个目的地相关联,因此没有 API 调用来执行查找以确定这种关联。
    • 您使用的是什么 JMS 代理?如果您愿意将一些不可移植的代码烘焙到您的应用程序中,它可能有一种特定于实现的方式来做您想做的事情。
    • 再次感谢贾斯汀!我可以看到我有几个选项可以通过经纪人 (Artemis) 的专有 API 来处理这个问题,但我真的想避免。那。你可能想知道为什么这对我来说是个大问题。当我们出现服务中断时,我们的客户每分钟对我们罚款数千美元。因此,在非暂时性错误的情况下,我们希望立即出现在 DLQ 中,以便我们的支持人员能够解决它们。我们不能接受不必要的重试。如果不必要地重试 20 分钟,如果影响客户的生产,可能会导致 100,000 美元的退款。
    • 您的用例非常合理。我在 ActiveMQ 上工作,所以如果您认为有什么可以使这更容易的,请告诉我。将来也许这样的东西可能会被纳入 Jakarta Messaging(即 JMS 的替代品)。
    猜你喜欢
    • 2015-06-14
    • 2016-05-02
    • 2014-08-30
    • 2022-07-28
    • 2011-01-11
    • 1970-01-01
    • 2016-12-10
    • 2014-11-20
    • 2019-06-21
    相关资源
    最近更新 更多