【问题标题】:JMSReplyTo, physical location of the JMS brokerJMSReplyTo,JMS 代理的物理位置
【发布时间】: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 中,我如何针对外部远程代理创建ConnectionFactoryConnectionSession 对象以发送回复@ 目的? JMS 规范是否保证启动会话的所有信息都可用,如果可以,如何保证?

【问题讨论】:

    标签: jakarta-ee jms activemq messaging messagebroker


    【解决方案1】:

    但实际上是什么将这个 Destination 对象与队列的心理位置联系起来?

    JMS 规范没有定义Destination 和物理位置之间的任何链接。 Destination 本质上只是对将发送消息的特定于实现的名称的引用。

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

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

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

    JMS 规范没有做出这样的保证。

    【讨论】: