我对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();
}
}
现在,消息使用者可以从JMSReplyTo
对象中选择Message
标头以获取对临时队列的引用,并应该向此特定队列发送响应。最后,发起人从该队列中接收它。
但实际上将此Destination
对象链接到队列的物理位置是什么?我正在考虑一种特殊情况,其中临时队列驻留在(请求)消费者域之外的因特网中的远程服务器中。首先必须有某种IP地址供消费者访问代理。这是由规范或提供商特定的强制要求吗?
如果有关远程代理的唯一可用信息位于,则如何针对外部远程代理创建ConnectionFactory
,Connection
和Session
对象以发送回复。 JMSReplyTo
标题Destination
对象? JMS规范是否保证启动会话的所有信息都可用,如果可用,如何?
答案 0 :(得分:1)
但实际上将这个Destination对象链接到队列的心理位置是什么?
JMS规范未定义Destination
与物理位置之间的任何链接。 Destination
基本上只是对特定于实现的名称的引用,其中将发送消息。
如果有关远程代理的唯一可用信息位于JMSReplyTo标头的Destination对象中,我如何针对外部远程代理创建ConnectionFactory,Connection和Session对象以发送回复?
除非您正在使用的实施已将其Destination
扩展为包含此类信息(即超出JMS规范的要求),否则您将无法基于此创建连接Destination
。我不知道任何具有此类扩展的实现,如果有任何实现,我会感到惊讶。
JMS规范是否保证启动会话的所有信息都可用,如果可用,如何?
JMS规范没有这样的保证。