MQJE001:IBM 中的完成代码“2”,原因“2033”问题仅用于获取一些消息

Car*_*yes 2 java ibm-mq

我目前正在从一个充满事务(消息)的远程队列中读取数据。我通过访问队列并测量记录的大小来阅读它。

getOptions.options = MQC.MQGMO_CONVERT + MQC.MQGMO_WAIT;
queue.getCurrentDepth();

仅当队列的大小大于 0 时。我继续获取消息。

我的问题是,对于某些消息,我收到以下错误:MQJE001:完成代码“2”,原因“2033”。

但仅对于某些消息,有趣的是我有一个自定义重试变量,第三次重试得到一条空白消息。

我可能的解决方案:

起初我认为这可能是 waitInterval 并且我已经将它从 150 毫秒更改为 30 秒。对于某些消息,我会在不到 100 毫秒的时间内正确获取它们。但是给我带来问题的消息占用了所有的waitInterval,然后给出错误并在第三次重试时得到空白消息。

第二个测试是验证MQMessage类的参数,我原来有:

  • 消息类型:8
  • 编码:273
  • 格式:
  • 字符集:0

当我正确收到消息时,以下参数仍然存在:

  • 消息类型:8
  • 编码:273
  • 格式:MQSTR
  • 字符集:819

当我在第三次重试时收到导致错误 2033 的消息时,我收到一条空白消息,并且参数更改为以下内容:

  • 消息类型:8
  • 编码:273
  • 格式:
  • 字符集:819

我开始认为队列中的消息没有指示正确的格式。所以我联系了支持人员,他们验证了所有消息都具有正确的转换标头。

所以我仍然怀疑为什么会出现这个问题,如果有人遇到过类似的问题,希望得到您的评论。谢谢你。

Rog*_*ger 7

您将 IBM MQ 视为数据库,这会给您带来各种痛苦。

这是您应该如何检索消息:

MQGetMessageOptions gmo = new MQGetMessageOptions();
gmo.options = CMQC.MQGMO_WAIT + CMQC.MQGMO_FAIL_IF_QUIESCING;
gmo.waitInterval = 5000;  // wait up to 5 seconds
MQMessage receiveMsg = null;
boolean getMore = true;

while(getMore)
{
   receiveMsg = new MQMessage();

   try
   {
      // get the message on the queue
      queue.get(receiveMsg, gmo);

      /*
       * Now go do something with the message
       */
   }
   catch (MQException e)
   {
      if ( (e.completionCode == CMQC.MQCC_FAILED) &&
           (e.reasonCode == CMQC.MQRC_NO_MSG_AVAILABLE) )
      {
         // No message - loop again
      }
      else
      {
         System.out.println("MQException: " + e.getLocalizedMessage());
         System.out.println("CC=" + e.completionCode + " : RC=" + e.reasonCode);
         getMore = false;
      }
   }
   catch (IOException e)
   {
      System.out.println("IOException:" +e.getLocalizedMessage());
   }
}
Run Code Online (Sandbox Code Playgroud)