1

私は3つのメッセージを送信しています

Message1 - 相関 ID:5000

空のメッセージ (本文なし) - 相関 ID:5001

Message2 - 相関 ID:5002

私の送信キューはこのように処理されます

Message1 - 相関 ID:5000

Message1-correlation id:5001 => 同じ前のメッセージが空のメッセージに上書きされました。*

Message2 - 相関 ID:5002

上記の 2 行目は Message1 ではなく、空である必要があります。何かご意見は?

私の取得方法

                mqGetMsgOpts = new MQGetMessageOptions();
                if (mqQueue != null)
                {
                    //Get options for the messsage                
                    mqGetMsgOpts.Options = MQC.MQGMO_BROWSE_FIRST | MQC.MQGMO_WAIT |  MQC.MQOO_INQUIRE;
                    mqGetMsgOpts.MatchOptions = MQC.MQMO_NONE;
                    mqGetMsgOpts.WaitInterval = 5000;  // 5 seconds limit for waiting
                }

              if (mqMsg.MessageLength > 0 && mqMsg.DataLength > 0)
              {
                messageData = mqMsg.ReadString(mqMsg.MessageLength);
              }

長さのチェックを行わないと、ストリーム リーダー関連の例外が発生します。

私のプット方法

if(mqQueue==null)
  mqQueue = mqQMgr.AccessQueue("Queue Name", MQC.MQOO_OUTPUT | MQC.MQOO_INPUT_SHARED | MQC.MQOO_INQUIRE);

   mqMsg.WriteString(message);
4

2 に答える 2

2

これを引き起こす可能性のある2つの問題を想像できます。

  1. 書き込みアプリケーションは、メッセージ 2 の空のメッセージ本文を送信しませんでした。
  2. 取得アプリケーションは、メッセージ 1 からのメッセージ バッファを表示しています。MQ から配信されるメッセージ バッファーがない場合、以前のメッセージ バッファーの内容が残ります。

何が起こったのかを判断するには、すべてのメッセージを入れることをお勧めしますが、サンプルを実行してそれらを取得する前に、代わりに提供されたサンプル amqsget のようなものを実行して、1 の可能性を除外します。

次に、アプリケーションの get バッファーに集中できます。返されたメッセージの長さがゼロであると MQ が言った場合は、それを使用していないことを確認してください。

于 2014-09-15T15:52:04.420 に答える
2

メッセージが WMQ で上書きされるのを聞いたことがありません。これはアプリケーションの問題に違いないと思います。このコード行:

mqGetMsgOpts.Options = MQC.MQGMO_BROWSE_FIRST | MQC.MQGMO_WAIT |  MQC.MQOO_INQUIRE;

このMQC.MQGMO_BROWSE_FIRSTオプションにより、WMQ は、MQMD 構造で指定された条件を満たす最初のメッセージを常に返すようになります。MQGMO_BROWSE_NEXTこのオプションが後で変更され、キュー内の次のメッセージを読み取るように指定されている場合、コード スニペットからはわかりません。

代わりに、メッセージを継続的に読み取るオプションをMQC.MQGMO_BROWSE_FIRST指定できます。MQGMO_BROWSE_NEXT

またMQC.MQOO_INQUIRE、GMO オプションに無効なものを指定しました。それを取り除く必要があります。

詳細な閲覧オプションはこちら

于 2013-04-20T14:16:09.343 に答える