【发布时间】:2018-09-17 10:13:21
【问题描述】:
我对 JMSReplyTo 标头的性质感到困惑。它包含javax.jms.Destination 类型的对象,通常是由消息的发起者创建的临时队列的逻辑句柄。这是一个临时队列创建和设置JMSReplyTo标头的实验示例。
@Component("jmsbean")
public static class JmsBean {
@Autowired
@Qualifier("jmscf1")
ConnectionFactory jmsServer1;
@Autowired
@Qualifier("jmscf2")
ConnectionFactory jmsServer2;
public String testJms(@Body String body) throws JMSException {
Connection conn = jmsServer1.createConnection();
conn.start();
Session session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
Connection conn2 = jmsServer2.createConnection();
conn2.start();
Session session2 = conn2.createSession(false, Session.AUTO_ACKNOWLEDGE);
TemporaryQueue tempQueue = session2.createTemporaryQueue();
TextMessage message = session.createTextMessage();
message.setJMSCorrelationID("tuomas");
message.setJMSReplyTo(tempQueue);
message.setJMSMessageID("tuomas");
message.setText(body);
Queue dest = session.createQueue("dest");
MessageProducer producer = session.createProducer(dest);
producer.send(message);
session.close();
conn.close();
MessageConsumer consumer = session2.createConsumer(tempQueue);
TextMessage reply = (TextMessage) consumer.receive();
session2.close();
conn2.close();
return reply.getText();
}
}
现在消息消费者可以从Message 对象中选择JMSReplyTo 标头来获取对临时队列的引用,并且应该向这个特定队列发送响应。最后,发起者从该队列中接收它。
但实际上是什么将这个Destination 对象链接到队列的物理位置?我正在考虑一种特殊情况,其中临时队列驻留在(请求)消费者域之外的远程服务器中、互联网中。首先,消费者必须有某种 IP 地址才能访问代理。那么这是规范要求的,还是提供商特定的?
如果有关远程代理的唯一可用信息在JMSReplyTo 标头的@987654332 中,我如何针对外部远程代理创建ConnectionFactory、Connection 和Session 对象以发送回复@ 目的? JMS 规范是否保证启动会话的所有信息都可用,如果可以,如何保证?
【问题讨论】:
标签: jakarta-ee jms activemq messaging messagebroker