MQ MessageConsumer 不响应 receive() 方法

MQ MessageConsumer does not respond to receive() method

我有一个 java 程序,我 运行 将消息写入中层 IBM MQ 以测试功能,然后再将我们的主程序附加到它们。写入方法如下所示:

  private static void sendSingleMessage(ConnectionFactory connectionFactory,
                                      String[] messages, String destination) throws Exception {
    Connection connection = null;
    try {
        connection = connectionFactory.createConnection();
        for (String payload : messages) {
            Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
            Queue queue = session.createQueue(destination);
            MessageProducer producer = session.createProducer(queue);
            Message msg = session.createTextMessage(payload);
            System.out.println("Sending text '" + payload + "'");
            producer.send(msg);
            session.close();
            System.out.println("Message sent");
        }
    } finally {
        if (connection != null) {
            connection.close();
        }
    }
}

connectionFactory 是在此方法执行之前设置的,但在该方法中我设置了 MQConncetionFactory 属性(主机、端口、通道、queuemanager 等...)此发送方法有效,我可以看到队列深度增加当我从我的主要方法调用它时我的 IBM MQ Explorer。

当我 运行 一个类似的 readSingleMessage 方法时,代码卡在 consumer.receive() 并且永远不会完成执行。见下文:

   private static void readSingleMessage(ConnectionFactory connectionFactory,
                                      String[] messages, String destination) throws Exception {
    Connection connection = null;
    try {
        connection = connectionFactory.createConnection();
        for (String payload : messages) {
            Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
            Queue queue = session.createQueue(destination);
            MessageConsumer consumer = session.createConsumer(queue);
            System.out.println("Recieving text '" + payload + "'");
            consumer.receive();
            session.close();
            System.out.println("Received message");
        }
    } finally {
        if (connection != null) {
            connection.close();
        }
    }
}

无论如何我可以进一步调试它,或者找出为什么我能够写入队列,但无法从中读取消息的原因?

您必须通过调用 start() 方法来启动 JMS 连接。在连接启动之前,您无法接收任何消息。 JMS 规范和 Javadoc 中对此进行了说明。

顺便说一句,如果您使用 JMS 2.0 "simplified" API 并创建一个 JMSContext 对象(一个本质上是 Connection 和 Session 组合的对象),您不需要调用 start 来接收消息。从中创建的消费者可用于接收消息而无需显式启动。