我有以下服务。
我想使用嵌入式 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"))
使用 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()
来获取队列的字符串
名称(如有必要)。