2015-05-19 3 views
3

В MSMQ есть функция, которая позволяет пользователям заглядывать в сообщение без фактического его потребления. то есть я заглядываю в следующее сообщение в очереди на основе MessageID. Если меня не интересует сообщение, я могу отправить сообщение обратно в очередь (т. Е. Неподтвержденные добавляются обратно в очередь и поддерживается идентификатор messageID).Взгляд сообщения в IBM MQ

Аналогичная функциональность также существует в RabbitMQ. Однако в RabbitMQ это не сделано чистым способом. Вы можете симулировать просмотр сообщений, выгружая сообщение из очереди, а затем не отправляя подтверждение, поэтому RabbitMQ затем добавит это сообщение обратно в очередь. Однако я читал, что RabbitMQ может изменять порядок сообщений и увеличивать идентификаторы сообщений, когда неподтвержденные сообщения повторно добавляются в очередь.

С кем сталкивалась эта проблема раньше.

Также известно ли, что IBM MQ поддерживает это поведение/функциональность заглядывания и поиска?

рассматривает D

+0

Что заглянуть и искать? Функциональность, которую вы ищете в IBM MQ для «заглядывания» в сообщение, называется «ПРОСМОТР». –

+0

Вы должны использовать 'javax.jms.Session.createBrowser (javax.jms.Queue)' для сканирования содержимого очереди, а затем использовать 'javax.jms.Session.createConsumer (Destination destination, java.lang.String messageSelector)' чтобы использовать нужное сообщение во время просмотра. – Stavr00

ответ

2

В IBM MQ, способ просмотра сообщений в очереди, если они не слишком велики по размеру является программа amqsbcg образца (просмотреть как упомянуто Tim). Вы можете использовать это для вывода сообщений в выходной файл без деструктивного get. Затем вы можете проанализировать файл, чтобы проверить идентификатор сообщения или другую необходимую информацию. Если вы нашли сообщение, соответствующее критериям, которые вам нужны, вам нужно будет выполнить GET с этими параметрами, чтобы фактически удалить его из очереди.

amqsbcg QUEUENAME QMGRNAME > output.file 

Данный пример можно найти в

AIX/Unix: $MQ_HOME/samp/bin/amqsbcg 
Windows: $MQ_HOME\tools\c\Samples\Bin\amqsbcg.exe 

Где $ MQ_HOME это подходящее место для вашей операционной системы. Расположение по умолчанию для $ MQ_HOME является:

AIX:/USR/ДМК

Unix:/OPT/ДМК

для Windows: C: \ Program Files \ IBM \ WebSphere MQ

Другим возможным опцией может быть поддержка «qload» MO03 pac. Он имеет возможность позволить вам фильтровать сообщения Id, CorrelId Id или Id Group

http://www-01.ibm.com/support/docview.wss?acss=wmq062007&rs=171&uid=swg24009368

+0

Похоже, он спрашивает об этом в своем собственном коде, поэтому вы можете упомянуть о вызове API просмотра и о том, как он не работает автоматически, как это делает RabbitMQ. –

+0

Как упоминает T. Rob, вызов API IBM MQ для просмотра не включает автоакку. – ValerieLampkin

3

IBM MQ предоставляет возможность просматривать сообщения, не удаляя их из очереди. Вы можете начать просмотр сообщений с самого начала и повторить все сообщения в очереди. Вы также можете просмотреть определенное сообщение с помощью MessageId или CorrelationId.

Вот фрагмент в C# для просмотра сообщений в очереди.

/// <summary> 
    /// Browse messages in a queue 
    /// </summary> 
    private void BrowseMessages() 
    { 
     MQQueueManager qm = null; 
     MQQueue queueGet = null; 
     Hashtable mqProps = null; 

     try 
     { 
      mqProps = new Hashtable(); 
      // Setup properties for connection 
      mqProps.Add(MQC.TRANSPORT_PROPERTY, MQC.TRANSPORT_MQSERIES_MANAGED); 
      mqProps.Add(MQC.HOST_NAME_PROPERTY, "localhost"); 
      mqProps.Add(MQC.PORT_PROPERTY, 1414); 
      mqProps.Add(MQC.CHANNEL_PROPERTY, "QM.SVRCONN"); 

      // Open connection to queue manager 
      qm = new MQQueueManager("QM", mqProps); 

      // Open queue for browsing 
      queueGet = qm.AccessQueue("Q1", MQC.MQOO_BROWSE | MQC.MQOO_FAIL_IF_QUIESCING); 

      // In a loop browse all messages till we reach end of queue 
      while (true) 
      { 
       try 
       { 
        // Need to create objects everytime 
        MQMessage msg = new MQMessage(); 
        MQGetMessageOptions gmo = new MQGetMessageOptions(); 

        // Use browse next option to start browsing 
        gmo.Options = MQC.MQGMO_BROWSE_NEXT; 
        queueGet.Get(msg, gmo); 
        Console.WriteLine(msg.ReadString(msg.MessageLength)); 
       } 
       catch (MQException mqex) 
       { 
        // When there are no more messages to browse, the Get call 
        // will throw MQException with reason code MQC.MQRC_NO_MSG_AVAILABLE. 
        // But here we close the queue and break out of loop for all exceptions 
        queueGet.Close(); 
        break; 
       } 
      } 
      qm.Disconnect(); 
     } 
     catch (MQException mqex) 
     { 
      Console.WriteLine(mqex); 
     } 
    } 
+0

FYI MQC.MQGMO_BROWSE_NEXT не устарел, в версии 8.0.X используется CMQC.MQGMO_BROWSE_NEXT –

Смежные вопросы