无法从MQ队列检索消息

时间:2015-02-21 11:57:26

标签: java ibm-mq

我正在尝试从MQ队列中检索消息。以下是我正在使用的代码:

    //Fetching Queue details
    MQEnvironment.hostname=getMqCall().getMqHost();
    MQEnvironment.channel=getMqCall().getMqChannel();
    MQEnvironment.port=getMqCall().getMqPort();
    MQQueueManager qMgr= new MQQueueManager(getMqCall().getMqQueManager());
    MQQueue outputQueue = qMgr.accessQueue(getMqCall().getRespQueue(), MQC.MQOO_INQUIRE | MQC.MQOO_BROWSE | MQC.MQOO_INPUT_AS_Q_DEF);

    //Checking for messages in queue
    int i=outputQueue.getCurrentDepth();
    System.out.println("Number of messages in Assign promo queue:: "+i);

    for(int j=0;j<i;j++){
    MQMessage sampleResponse = new MQMessage();
    MQGetMessageOptions gmo = new MQGetMessageOptions();
    outputQueue.get(sampleResponse, gmo);
    String msgtext = sampleResponse.readStringOfCharLength(sampleResponse.getMessageLength());

    System.out.println("Message read is: "+msgtext);
    System.out.println("Response length: "+sampleResponse.getTotalMessageLength());

    if(msgtext!=null){

    // Some code

    }else{

    System.out.println("Message not read from response queue");

    }

    }

    //Checking for messages in queue after processing
    i=outputQueue.getCurrentDepth();
    System.out.println("Number of messages in queue after processing :: "+i);

    outputQueue.close();
    qMgr.close();
    qMgr.disconnect();

我将msgtext值视为null,即使getCurrentDepth()向我显示队列中存在值。即使getTotalMessageLength()返回null值也是如此。已验证该队列中是否存在消息。

之前我使用readString()方法代替readStringOfCharLength()。但是,我仍然没有收到回复,所以我使用readStringOfCharLength()进行了检查,因为readString()方法已被弃用。

我甚至尝试使用readLine()方法,但仍然无法检索消息。

提前致谢。

PS:我通过一个每15分钟运行一次的调度程序来运行上面的代码。

1 个答案:

答案 0 :(得分:2)

永远不要根据队列的当前深度设置循环。有许多理由从未这样做,并且在IBM的MQ标准文档中有记录。

其次,确保捕获MQ抛出的MQExceptions。否则,您将发布消息说&#34;其中&#39; s我的消息&#34;。 MQException最重要的是原因代码。 MQ知识中心中记录了所有MQ原因代码。为链接添加书签并用于查找原因代码。

最后,这是一个结构合理的Java / MQ程序:

private void testReceive()
{
   int openOptions = CMQC.MQOO_INQUIRE + CMQC.MQOO_INPUT_SHARED + CMQC.MQOO_FAIL_IF_QUIESCING;
   MQGetMessageOptions getOptions = new MQGetMessageOptions();
   getOptions.options = CMQC.MQGMO_NO_WAIT + CMQC.MQGMO_FAIL_IF_QUIESCING;
   boolean getMore = true;
   MQQueueManager qMgr = null;
   MQQueue queue = null;
   MQMessage receiveMsg = null;

   try
   {
      qMgr = new MQQueueManager(qManager);
      queue = qMgr.accessQueue(inputQName, openOptions);

      while(getMore)
      {
         try
         {
            receiveMsg = new MQMessage();
            queue.get(receiveMsg, getOptions);
            byte[] b = new byte[receiveMsg.getMessageLength()];
            receiveMsg.readFully(b);
            System.out.println("Message-->" + new String(b));
         }
         catch (MQException e)
         {
            if ( (e.completionCode == CMQC.MQCC_WARNING) &&
                 (e.reasonCode == CMQC.MQRC_NO_MSG_AVAILABLE) )
            {
               System.out.println("Bottom of the queue reached.");
               getMore = false;
            }
            else
            {
               System.err.println("MQRead CC=" +e.completionCode + " : RC=" + e.reasonCode);
               getMore = false;
            }
         }
         catch (IOException e)
         {
            System.out.println("MQRead " +e.getLocalizedMessage());
         }
      }
   }
   catch (MQException e)
   {
      System.err.println("MQRead CC=" +e.completionCode + " : RC=" + e.reasonCode);
   }
   finally
   {
      try
      {
         if (queue != null)
            queue.close();
      }
      catch (MQException e)
      {
         System.err.println("MQRead CC=" +e.completionCode + " : RC=" + e.reasonCode);
      }
      try
      {
         if (qMgr != null)
            qMgr.disconnect();
      }
      catch (MQException e)
      {
         System.err.println("MQRead CC=" +e.completionCode + " : RC=" + e.reasonCode);
      }
   }
}