Как правильно получить сообщение из очереди IBM MQ - PullRequest
0 голосов
/ 21 февраля 2019

Этот код должен читать из очереди, если очередь пуста, то повторить чтение по таймеру, проверить формат текста или байта.Правильно ли в этом формате проверять пустую очередь?И будет ли работать таймер в этом случае?Пока невозможно проверить, поскольку очередь 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());
            }
    }
}

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

Если нет необходимости использовать таймер, я предпочитаю использовать receive(timeout).Если в очереди было сообщение, ответный вызов вернется с сообщением, в противном случае произойдет тайм-аут с исключением с кодом причины 2033.Вы можете перехватить это исключение и снова позвонить на прием, чтобы дождаться сообщения.Это также позволит вам остановить эту ветку, когда вас попросят.

Вместо (TextMessage) receiver.receive() просто сделайте Message msg = receiver.receive() и затем используйте if(msg instanceof TextMessage), чтобы определить тип полученного сообщения.

0 голосов
/ 21 февраля 2019

Обратите внимание, что ваш receiver.receive(); вызов будет заблокирован на неопределенный срок.От MQMessageConsumer doc:

Получает следующее сообщение, созданное для этого получателя сообщения.Этот вызов блокируется на неопределенный срок до тех пор, пока не будет создано сообщение или пока этот потребитель не будет закрыт.

, если вы хотите читать из очереди в течение определенного периода времени, возможно, вам лучше использовать receive(long timeout)Метод:

public javax.jms.Message receive (длинный тайм-аут) выдает javax.jms.JMSException

Получает следующее сообщение, которое приходит в течение указанного интервала времени ожидания.Этот вызов блокируется до тех пор, пока не прибудет сообщение, не истечет время ожидания или не будет закрыт этот получатель сообщения.Тайм-аут, равный нулю, никогда не истекает, и вызов блокируется на неопределенный срок.

...