1. ホーム
  2. java

[解決済み] MQJE001: IBM Only For Getting Some Messagesの完了コード「2」、理由「2033」問題

2022-02-09 09:38:36

質問事項

現在、リモートキューから読み込んでいますが、このキューはトランザクション(メッセージ)で満たされています。キューにアクセスし、レコードのサイズを計測することで読み込んでいます。

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

キューのサイズが0より大きいときだけ、メッセージを取得するように進みます。

私の問題は、いくつかのメッセージについて、次のようなエラーが発生することです。 MQJE001: 完了コード '2'、理由 '2033'。

しかし、いくつかのメッセージに対してのみ、おかしなことに、私はカスタム再試行変数を持っており、3回目の再試行は空白のメッセージを取得します。

私の考えられる解決策

最初はwaitIntervalのせいかと思い、150msから30秒まで変化させています。いくつかのメッセージでは、100ミリ秒以下で正しく表示されるようになりました。しかし、私に問題を与えるメッセージは、すべてのwaitIntervalを取り、そしてエラーを与え、3回目の再試行に空白のメッセージを取得します。

2つ目のテストは、MQMessageクラスのパラメータを確認することで、私はもともと持っています。

  • messageType: 8
  • のエンコーディングになります。273
  • 形式を使用します。
  • 文字セットです。0

正しくメッセージが表示されると、以下のパラメータが残ります。

  • messageType: 8
  • のエンコーディングになります。273
  • 形式を使用します。MQSTR
  • 文字セット: 819

3回目のリトライでエラー2033が発生するメッセージがある場合、空白のメッセージが表示され、パラメータが以下のように変化します。

  • messageType: 8
  • のエンコーディングになります。273
  • 形式を使用します。
  • 文字セット: 819

キューにあるメッセージが正しいフォーマットを示していないと思うようになりました。そこで、サポートに連絡したところ、すべてのメッセージに正しい変換ヘッダーがあることを確認しました。

なぜこのような問題が起こるのか、まだ疑問です。もし同じようなことに直面した方がいらっしゃいましたら、コメントをお願いします。ありがとうございました。

解決方法を教えてください。

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());
   }
}