首页 > 解决方案 > 如何正确接收来自队列 IBM MQ 的消息

问题描述

这段代码应该从队列中读取,如果队列为空,则通过计时器重复读取,检查文本或字节的格式。这种格式检查空队列是否正确?在这种情况下计时器会起作用吗?由于未配置 MQ 队列,因此无法检查。

public class Main {
    public static void main(String[] args) {
boolean tru = true;

        try {
            /*MQ Конфигурация подключения*/
            MQQueueConnectionFactory mqQueueConnectionFactory = new MQQueueConnectionFactory();
            mqQueueConnectionFactory.setHostName("localhost");
            mqQueueConnectionFactory.setChannel("SVRCONN");
            mqQueueConnectionFactory.setPort(1414);
            mqQueueConnectionFactory.setIntProperty(WMQConstants.WMQ_CONNECTION_MODE, WMQConstants.WMQ_CM_CLIENT);
            mqQueueConnectionFactory.setQueueManager("MQ_APPLE");
            mqQueueConnectionFactory.setTransportType(JMSC.MQJMS_TP_CLIENT_MQ_TCPIP);
            QueueConnection queueConnection = mqQueueConnectionFactory.createQueueConnection("name", "pass");
            MQQueueSession session = (MQQueueSession) queueConnection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
            MQQueue queue = (MQQueue) session.createQueue("queue:///Q1");
            MQQueueReceiver receiver = (MQQueueReceiver) session.createReceiver(queue);
            queueConnection.start();

          while(tru){
              TextMessage receivedMessage = (TextMessage) receiver.receive();
              if(receivedMessage != null){
                  MStart(receivedMessage);
                  tru = false;
              } else {
                  Timer timer = new Timer(10000,new ActionListener() {
                      public void actionPerformed(ActionEvent arg0) {
                          System.out.println("Timer Run");
                      }
                  });
                  timer.start();
              }
          }

            receiver.close();
            session.close();
            queueConnection.close();

        } catch (JMSException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void MStart(TextMessage receivedMessage) throws JMSException {
            if (receivedMessage instanceof BytesMessage) {
                TextMessage textMessage = (TextMessage) receivedMessage;
                System.out.println("Received message '"
                        + textMessage.getText() + "'");
            } else if (receivedMessage instanceof TextMessage) {
                System.out.println("Received message: " + receivedMessage.getText());
            }
    }
}

标签: javajmsibm-mq

解决方案


请注意,您的receiver.receive();通话将无限期阻塞。来自MQMessageConsumer文档:

接收为此消息使用者生成的下一条消息。此调用将无限期阻塞,直到生成消息或关闭此消息使用者。

如果您想在指定的时间内从队列中读取,也许您应该更好地使用该receive(long timeout)方法:

公共 javax.jms.Message 接收(长时间超时)抛出 javax.jms.JMSException

接收在指定超时间隔内到达的下一条消息。此调用阻塞,直到消息到达、超时到期或此消息使用者关闭。零超时永不过期,并且调用无限期阻塞。


推荐阅读