提问者:小点点

JMSReplyTo - 如何为 VM/Artemis/IBM MQ 创建通用骆驼路由


我有以下服务。

  • Spring启动 2.5.13
  • 骆驼 3.18.0
  • 联合医务处

我想使用嵌入式 ActiveMQ Artemis、独立的 ActiveMQ Artemis 和 IBM MQ。

我已经设法让所有 3 个运行并连接,但我无法弄清楚的一件事是 JMSReplyTo 选项。

使用嵌入式代理在本地运行:

这运行良好。我可以向队列写入一条消息,并将响应发送到 JMSReplyTo:

public void sendRequest(){
    ActiveMQQueue activeMQQueue = new ActiveMQQueue("RESPONSE_QUEUE");
    jmsTemplate.convertAndSend("REQUEST_QUEUE", "Hello", pp -> {
        pp.setJMSReplyTo(activeMQQueue);
        return pp;
    });
}

通过ActiveMQ Artemis控制台:

这就是不稳定性的地方,因为接收的对象ActiveMQDestination,这使得设置CamelJmsDestination更加复杂。

我在这里浪费时间吗?我应该只获取队列名称并手动构造 uri 吗?或者我缺少一些关于它如何工作的逻辑?或者也许我没有以正确的方式使用 Artemis 控制台?

.setExchangePattern(ExchangePattern.InOut)
.setHeader("CamelJmsDestination", header("JMSReplyTo"))


共1个答案

匿名用户

使用 javax.jms.Message#setJMSReplyTo(Destination) 时,您必须传递一个 javax.jms.Destination,该目的地必须实现以下其中一项:

  • javax.jms.Queue
  • javax.jms.TemporaryQueue
  • javax.jms.Topic
  • javax.jms.TemporaryTopic

为了在ActiveMQ Artemis的Web控制台中通过文本重现此语义,您需要分别在目标名称前面加上以下前缀之一:

  • 队列://
  • 温度 queue://
  • 主题://
  • 温度 topic://

因此,当您设置 JMSReplyTo 标头时,请尝试使用 queue://RESPONSE_QUEUE

当你的应用程序收到这条消息并调用getJMSReplyTo()时,它将收到一个javax.jms.Queue实现(即ActiveMQQueue),然后你可以使用getQueueName()来获取队列的字符串名称(如有必要)。