MQ MessageConsumer不响应receive()方法

时间:2018-01-08 21:33:59

标签: jms ibm-mq

我运行了一个java程序,用于向Mid-Tier IBM MQ编写消息,以便在将主程序附加到它们之前测试功能。 write方法如下所示:

  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属性(主机,端口,通道,队列管理器等等)。这个send方法有效,我可以看到IBM的队列深度增加我从我的main方法调用它时的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();
        }
    }
}

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

1 个答案:

答案 0 :(得分:2)

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

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