JMSReplyTo,JMS代理的物理位置

时间:2018-04-07 15:13:10

标签: java-ee jms activemq messaging messagebroker

我对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地址供消费者访问代理。这是由规范或提供商特定的强制要求吗?

如果有关远程代理的唯一可用信息位于,则如何针对外部远程代理创建ConnectionFactoryConnectionSession对象以发送回复。 JMSReplyTo标题Destination对象? JMS规范是否保证启动会话的所有信息都可用,如果可用,如何?

1 个答案:

答案 0 :(得分:1)

  

但实际上将这个Destination对象链接到队列的心理位置是什么?

JMS规范未定义Destination与物理位置之间的任何链接。 Destination基本上只是对特定于实现的名称的引用,其中将发送消息。

  

如果有关远程代理的唯一可用信息位于JMSReplyTo标头的Destination对象中,我如何针对外部远程代理创建ConnectionFactory,Connection和Session对象以发送回复?

除非您正在使用的实施已将其Destination扩展为包含此类信息(即超出JMS规范的要求),否则您将无法基于此创建连接Destination。我不知道任何具有此类扩展的实现,如果有任何实现,我会感到惊讶。

  

JMS规范是否保证启动会话的所有信息都可用,如果可用,如何?

JMS规范没有这样的保证。