Jakarta ee JMS ReplyTo-它是如何工作的?

Jakarta ee JMS ReplyTo-它是如何工作的?,jakarta-ee,jms,Jakarta Ee,Jms,JMS API允许消息声明replyTo目的地实例。(即队列,主题的超类)。然后,服务可以使用此队列向发件人发送回复消息 对于可设置为ReplyTo值的目的地是否有任何限制?这似乎不太可能起作用,因为服务甚至可能没有任何到定义的目的地的网络路由,因此无法返回任何消息。JMS是否以某种方式断言所提供的目的地的有效性(可达性)?或者只是由服务尝试对给定的目的地做出响应,并在必要时失败。场景1 在这种情况下,目的地是预先配置的,因此被证明是有效的。将此目的地设置为JMSReplyTo头的值没有多少价值

JMS API允许消息声明replyTo
目的地
实例。(即
队列
主题
的超类)。然后,服务可以使用此队列向发件人发送回复消息


对于可设置为ReplyTo值的
目的地
是否有任何限制?这似乎不太可能起作用,因为服务甚至可能没有任何到定义的
目的地的网络路由,因此无法返回任何消息。JMS是否以某种方式断言所提供的
目的地的有效性(可达性)?或者只是由服务尝试对给定的
目的地做出响应,并在必要时失败。

场景1

在这种情况下,
目的地
是预先配置的,因此被证明是有效的。将此目的地设置为
JMSReplyTo
头的值没有多少价值,因为接收方可能已经知道此预配置目的地的存在

场景2

在这种情况下,发送方创建了一个临时的目的地,接收方只有在收到的
消息
上调用
getJMSReplyTo()
方法才能知道这一点。这种方法在发送方和接收方之间建立了一个私有通道。关于临时目的地的利弊

示例代码

Queue tempQueue = qSession.createTemporaryQueue();
TextMessage request = qSession.createTextMessage();
request.setJMSReplyTo(tempQueue);
QueueReceiver qReceiver = qSession.createReceiver(tmpQueue);
Message response = qReceiver.receive();

谢谢发送方和接收方是否都需要使用相同的JNDI服务?@Synesso在文章中添加了一个链接,以回答您的问题。Aha“静态目的地……具有消费者和生产者的众所周知的身份(通过JNDI解决)”。再次感谢。@Aravind在写我自己的答案之前,我想指出,在一些JMS代理上,您的代码可能无法工作,除非发布者和使用者使用创建临时主题的同一会话。这就是为什么我极力争取JBossMQ允许AS支持一个选项来自动创建任何以前没有创建过的引用运行时队列,如AMQ、RabbitMQ等。JBoss确实遵循了规范,但它并不实用,因为如果它是一个代理到代理拓扑,那么这可能会失败。这个问题仍然是高度相关的。答案中的链接已经失效,有人可以更新它吗?(顺便说一句,在回答中有一个外部链接的摘要总是很好的)