2017-09-06 10 views
2

MQ経由で送信されたセグメント化されたメッセージを読み込み、エラーメッセージが表示されるクライアントを作成しました。コードワークの下には完全に罰金が、それは一度に単一のメッセージを読んで、アプリケーションは、私はオプションにMQGMO_SYNCPOINTを追加するとMQセグメント化メッセージの読み取りに関する問題

public void getMessage(){ 

     try { 

      MQEnvironment.hostname = ""; 
      MQEnvironment.channel = ""; 
      MQEnvironment.port = ; 

      MQQueueManager QMgr = new MQQueueManager("MQManager"); 

      MQGetMessageOptions gmo = new MQGetMessageOptions(); 

      gmo.options = MQConstants.MQOO_INPUT_AS_Q_DEF| 
         MQConstants.MQGMO_WAIT| 
         MQConstants.MQGMO_ALL_SEGMENTS_AVAILABLE| 
         MQConstants.MQGMO_LOGICAL_ORDER; 

      gmo.matchOptions = MQConstants.MQMO_NONE; 
      gmo.waitInterval = MQConstants.MQWI_UNLIMITED; 

      MQMessage message = new MQMessage(); 
      MQQueue queue = QMgr.accessQueue("QName", 
              gmo.options); 

      while(true){ 

      queue.get(message, gmo); 
      int dataLength = message.getDataLength();   
      System.out.println(message.readStringOfCharLength(dataLength)); 
      message.clearMessage(); 
      } 
     } catch (Exception e) { 

      e.printStackTrace(); 
     } 
    } 

が、それはcom.ibm.mq.MQExceptionで失敗したかったものではありませんセグメント化されたメッセージを連結しています:MQJE001:完了コード '2'、理由 '2046'。

これがなぜ失敗するのか分かりませんが、私は少なくともこれを動作させることができれば、アプリケーション内のすべてのセグメント化されたメッセージを安全に処理してからコミットできます。

public void getMessage(){ 

     try { 

      MQEnvironment.hostname = ""; 
      MQEnvironment.channel = ""; 
      MQEnvironment.port = ; 

      MQQueueManager QMgr = new MQQueueManager("MQManager"); 

      MQGetMessageOptions gmo = new MQGetMessageOptions(); 

      gmo.options = MQConstants.MQOO_INPUT_AS_Q_DEF| 
         MQConstants.MQGMO_WAIT| 
         MQConstants.MQGMO_ALL_SEGMENTS_AVAILABLE| 
         MQConstants.MQGMO_LOGICAL_ORDER| 
         MQConstants.MQGMO_SYNCPOINT; 

      gmo.matchOptions = MQConstants.MQMO_NONE; 
      gmo.waitInterval = MQConstants.MQWI_UNLIMITED; 

      MQMessage message = new MQMessage(); 
      MQQueue queue = QMgr.accessQueue("QName", 
              gmo.options); 

      while(true){ 

       queue.get(message, gmo); 
       int dataLength = message.getDataLength();   
       System.out.println(message.readStringOfCharLength(dataLength)); 
       QMgr.commit(); 
       message.clearMessage(); 
      } 
     } catch (Exception e) { 

      e.printStackTrace(); 
     } 
    } 

セグメント化されたメッセージを1つのメッセージとして読み込もうとすると、 com.ibm.mq.MQException:MQJE001:完了コード '2'、理由 '2046'で失敗します。

この問題の解決に役立つものがあれば幸いです。私は本当に下のコードで何が間違っているのか分かりません。これは、分割されたメッセージを読むための私の好きな方法です。

public void getMessage(){ 


     try { 

      MQEnvironment.hostname = ""; 
      MQEnvironment.channel = ""; 
      MQEnvironment.port = ; 

      MQQueueManager QMgr = new MQQueueManager("MQManager"); 

      MQGetMessageOptions gmo = new MQGetMessageOptions(); 

      gmo.options = MQConstants.MQOO_INPUT_AS_Q_DEF| 
         MQConstants.MQGMO_WAIT| 
         MQConstants.MQGMO_COMPLETE_MSG; 

      gmo.matchOptions = MQConstants.MQMO_NONE; 
      gmo.waitInterval = MQConstants.MQWI_UNLIMITED; 

      MQMessage message = new MQMessage(); 
      MQQueue queue = QMgr.accessQueue("QName", 
              gmo.options); 

      while(true){ 

       queue.get(message, gmo); 
       int dataLength = message.getDataLength();   
       System.out.println(message.readStringOfCharLength(dataLength)); 
       message.clearMessage(); 
      } 
     } catch (Exception e) { 

      e.printStackTrace(); 
     } 
    } 

答えて

1

問題は、getためaccessQueue方法とGETメッセージオプションのためのオープンな選択肢としてgmo.optionsを使用していることです。開いているオプションとメッセージオプションをこのフィールドに混在させています。

各オプションは、オプションフィールドのビットで表されます。このフィールドをオープンオプションとして使用すると、getメッセージオプションを指定しても、ビットはMQによってオープンオプションとして解釈され、getメッセージオプションとしてフィールドを使用するとMQはgetメッセージオプションとして解釈されます。


あなたが同等のオープンに伴い進として表現または値に基づいてオプションを取得するあなたのサンプルに指定されている各オプションの値を見てみましょう:あなたは間違って使用しているので

MQOO_INPUT_AS_Q_DEF   0x00000001 
MQGMO_WAIT      0x00000001 

MQOO_INPUT_SHARED    0x00000002 
MQGMO_SYNCPOINT    0x00000002 

MQOO_RESOLVE_NAMES    0x00010000 
MQGMO_COMPLETE_MSG    0x00010000 

MQOO_BIND_NOT_FIXED   0x00008000 
MQGMO_LOGICAL_ORDER   0x00008000 

MQOO_RESOLVE_LOCAL_Q   0x00040000 
MQOO_RESOLVE_LOCAL_TOPIC  0x00040000 
MQGMO_ALL_SEGMENTS_AVAILABLE 0x00040000 

これはオープンオプションとしてQMgr.accessQueue("QName",gmo.options); MQは予期しない方法でこれを解釈しています。あなたの最初の「作業」たとえば


これらの特定のオープンオプションが一緒に、以下の指定されているように、オープンのオプションが解釈されてしまうこともそれかかわらず、「作業」である理由は、ローカルキューのいずれかの問題を起こしません正しくありません:

MQOO_INPUT_AS_Q_DEF   0x00000001 
MQOO_INPUT_AS_Q_DEF   0x00000001 //MQGMO_WAIT 
MQOO_RESOLVE_LOCAL_Q   0x00040000 //MQGMO_ALL_SEGMENTS_AVAILABLE 
MQOO_RESOLVE_LOCAL_TOPIC  0x00040000 //MQGMO_ALL_SEGMENTS_AVAILABLE 
MQOO_BIND_NOT_FIXED   0x00008000 //MQGMO_LOGICAL_ORDER 

のオプションは以下の指定として解釈されているので、それがある2046 (MQRC_OPTIONS_ERROR)で失敗し、2番目の例では。あなたが開いているオプションで一緒にMQOO_INPUT_AS_Q_DEFMQOO_INPUT_SHAREDを持つことができない、これは​​が発生します。

のオプションは以下の指定として解釈されているので、それがある 2046 (MQRC_OPTIONS_ERROR)で失敗し、あなたの第三の例では
MQOO_INPUT_AS_Q_DEF   0x00000001 
MQOO_INPUT_AS_Q_DEF   0x00000001 //MQGMO_WAIT 
MQOO_RESOLVE_LOCAL_Q   0x00040000 //MQGMO_ALL_SEGMENTS_AVAILABLE 
MQOO_RESOLVE_LOCAL_TOPIC  0x00040000 //MQGMO_ALL_SEGMENTS_AVAILABLE 
MQOO_BIND_NOT_FIXED   0x00008000 //MQGMO_LOGICAL_ORDER 
MQOO_INPUT_SHARED    0x00000002 //MQGMO_SYNCPOINT 

MQOO_RESOLVE_NAMESのみMQ C++のAPIで有効なものとして文書化され、これが原因​​:それはMQGMO_WAITと同じ値を持っているので、すべての問題を引き起こしていないGETメッセージオプションとしてMQOO_INPUT_AS_Q_DEFを使用して

MQOO_INPUT_AS_Q_DEF   0x00000001 
MQOO_INPUT_AS_Q_DEF   0x00000001 //MQGMO_WAIT 
MQOO_RESOLVE_NAMES    0x00010000 //MQGMO_COMPLETE_MSG 

いるあなたをあなたの例のそれぞれにすでにあります。これは、getメッセージオプションの動作を変更していないことを示しています。

MQGMO_WAIT      0x00000001 //MQOO_INPUT_AS_Q_DEF 
MQGMO_WAIT      0x00000001 

2番目と3番目の例に基づいて次の動作するはず:

public void getMessage(){ 


     try { 

      MQEnvironment.hostname = ""; 
      MQEnvironment.channel = ""; 
      MQEnvironment.port = ; 

      MQQueueManager QMgr = new MQQueueManager("MQManager"); 

      // Set up the options on the queue we wish to open 
      int openOptions = MQConstants.MQOO_INPUT_AS_Q_DEF; 

      MQGetMessageOptions gmo = new MQGetMessageOptions(); 

      gmo.options = MQConstants.MQGMO_WAIT| 
          MQConstants.MQGMO_ALL_SEGMENTS_AVAILABLE| 
          MQConstants.MQGMO_LOGICAL_ORDER| 
          MQConstants.MQGMO_SYNCPOINT| 
          MQConstants.MQGMO_COMPLETE_MSG; 

      gmo.matchOptions = MQConstants.MQMO_NONE; 
      gmo.waitInterval = MQConstants.MQWI_UNLIMITED; 

      MQMessage message = new MQMessage(); 
      MQQueue queue = QMgr.accessQueue("QName", openOptions); 

      while(true){ 

       queue.get(message, gmo); 
       int dataLength = message.getDataLength();   
       System.out.println(message.readStringOfCharLength(dataLength)); 
       QMgr.commit(); 
       message.clearMessage(); 
      } 
     } catch (Exception e) { 

      e.printStackTrace(); 
     } 
    } 

あなたは完全なMQクライアントは、あなたが何を見つけることができますインストールされてmqscユーティリティが付属し実行した場合エラーコードは、

$mqrc 2046 

     2046 0x000007fe MQRC_OPTIONS_ERROR 
+0

Tハンク、それは働いた。上記のコードでint型のopenOptions = MQOO_INPUT_AS_Q_DEFを宣言する必要があります。 –

+0

@ RajK、あなたが私の研究に費やしてくれた時間を感謝したなら、あなたのためにこの答えを書いてください。下の矢印の下の答えの左側にある "灰色の"チェックマークをクリックして答えを示してください。それが受け入れられていることを示す緑。 – JoshMc

+0

ちょうど答えを受け入れました。ご協力いただきありがとうございます。 –

関連する問題