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

smdnsysy  于 2022-11-07  发布在  Apache
关注(0)|答案(1)|浏览(142)

我有以下服务。

  • Spring Boot 2.5.13
  • 驼色3.18.0
  • JMS系统

我想使用嵌入式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控制台:

这就是不稳定性出现的地方,因为接收到的Object是一个ActiveMQDestination,这使得设置CamelJmsDestination更加复杂。
我在这里是在浪费时间吗?我应该只是获取队列名称并手动构造URI吗?或者我缺少了一些关于如何工作的逻辑?或者我没有以正确的方式使用Artemis控制台?

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

llycmphe

llycmphe1#

当使用javax.jms.Message#setJMSReplyTo(Destination)时,您必须传递javax.jms.Destination,它必须实作下列其中一项:

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

为了通过ActiveMQ Artemis的Web控制台中的文本再现此语义,您需要分别使用以下内容之一作为目的地名称的前缀:

  • queue://
  • temp-queue://
  • topic://
  • temp-topic://

因此,当您设置JMSReplyTo头时,请尝试使用queue://RESPONSE_QUEUE
当您的应用程序随后收到此消息并调用getJMSReplyTo()时,它将收到一个javax.jms.Queue实现(即ActiveMQQueue),然后您可以使用getQueueName()来获取队列的String名称(如果需要)。

相关问题