我有以下服务。
- 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"))
1条答案
按热度按时间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
名称(如果需要)。