【问题标题】:Can originalDestination be used as a selector for a dead-letter queue consumer?originalDestination 可以用作死信队列消费者的选择器吗?
【发布时间】:2020-07-06 22:31:11
【问题描述】:

我正在尝试从共享死信队列中使用,并且只想使用由我的应用程序创建的消息。我正在尝试在 originalDestination 属性上的消费者上添加一个选择器,但它不起作用。我有什么遗漏吗?

@JmsListener(destination = "${dlq}", selector = "originalDestination = 'Consumer.original.VirtualTopic.original'")
    public void onMessageReceived(Message message) {
        log.info(message.getOriginalDestination().toString());
        log.info(message.toString());
    }

【问题讨论】:

  • 正如 Tim 在他的回答中指出的那样,这在 ActiveMQ 5.x 中是不可能的。但是,如果您使用的是 ActiveMQ Artemis,则可以在代理向死信地址发送消息时添加的 _AMQ_ORIG_ADDRESS_AMQ_ORIG_QUEUE 消息属性上使用选择器。

标签: java spring spring-boot jms activemq


【解决方案1】:

JMSDestination 的属性表达式选择器将首先查看 originalDestination 字段,以便它可以工作。 作为字符串的原始目的地将具有队列/主题类型前缀。

这应该可行:

@JmsListener(destination = "${dlq}", selector = "JMSDestination = 'queue://Consumer.original.VirtualTopic.original'")

见:https://github.com/apache/activemq/blob/master/activemq-client/src/main/java/org/apache/activemq/filter/PropertyExpression.java#L48

【讨论】:

  • 出色的洞察力!非常感谢!对问题的评论和其他答案都是错误的!
【解决方案2】:

由于原始目标不是 JMS 保留属性(如 JMSReplyTo 等),也不是可通过标准消息 getObjectProperty 类型方法访问的消息属性,因此选择器无法处理该属性。

【讨论】:

  • 谢谢,我会为我们所有的消息添加一个特定的 ObjectProperty。
猜你喜欢
  • 2020-02-03
  • 2021-02-18
  • 2018-12-18
  • 1970-01-01
  • 1970-01-01
  • 2015-04-01
  • 2016-08-26
  • 2014-01-22
  • 2015-01-26
相关资源
最近更新 更多