【问题标题】:JMSListener escapes '.' for durable subscriptionsJMSListener 转义 '.'对于持久订阅
【发布时间】:2020-05-14 07:47:38
【问题描述】:

对于 Spring JMS 4.3.19 和 5.2.5,我正在尝试为持久订阅设置 JMSListener

@JmsListener(destination = "test", subscription = "Consumer.Test", connectionFactory = "factory")
public void receiveFromDurableSub(String message) {
    System.out.println("receiveFromTest: " + message);
}

但它最终出现在Consumer\\.Test。对于地址,它以某种方式起作用。

如何避免这些反斜杠?

【问题讨论】:

  • 用于持久订阅的实际名称并不重要,因为它将基于通过 JMS API 设置的客户端 ID 和订阅名称。为什么这对您来说是个问题?
  • 如果您想将消息发送到专用的消费者队列,您可以使用 FQQN。如果您通过 jmsTemplate 执行此操作,则需要添加那些斜杠,否则它将不起作用。如果您使用不同的客户端,例如stomp,你只需要一个斜线而不是两个。因此,如果有可能使其统一,那就更好了。此外,地址也没有斜线,所以这在某种程度上是不统一的。
  • 你为什么需要使用FQQN?很少有人愿意这样做。

标签: spring-boot spring-jms activemq-artemis


【解决方案1】:

JMS 主题订阅在 ActiveMQ Artemis 上作为队列实现。每个订阅都有自己的队列。

队列的名称取决于订阅的配置方式。代理将使用 JMS 客户端 ID(如果已配置)、JMS 订阅名称(如果已配置)和 JMS 订阅的持久性来构造底层订阅队列的名称。代理使用. 字符将所有这些信息连接在一起以构成最终名称。有关该位的更多详细信息,请参阅the related source code

为了以后能够分解此名称为其组成部分,必须对客户端 ID 或订阅名称中 . 字符的任何使用进行转义。

由于您使用 Consumer.Test 作为 JMS 订阅的名称,因此最终将转义为 Consumer\\.Test 以用于基础订阅队列的名称。在这种情况下,代理对 . 字符的使用不可配置。

如果您不希望订阅的名称被转义,那么我建议您不要使用包含. 字符的名称(例如Consumer-Test)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-14
    • 2013-12-17
    • 1970-01-01
    • 2015-08-24
    • 2017-09-05
    • 1970-01-01
    • 2015-08-11
    • 2017-01-24
    相关资源
    最近更新 更多