1

受信したプロパティの読み取りに大きな問題がありますMQMessage(WebSphere MQ 7.5 クライアントを使用しています)。いくつかのプロパティにアクセスすると、エラーがGetObjectProperty発生しMQRC_PROPERTY_NOT_AVAILABLEます。ロギング コードのエラーについて説明します。

アプリケーションにいくつかのロギング機能があります。この機能には、処理されたすべての MQ メッセージをダンプするオプションもあります。ダンプには、メッセージ本文、MQMD からのすべての標準メッセージ ヘッダー、およびすべての追加の JMS またはユーザー プロパティが含まれます。プロパティのダンプ時に問題が発生しGetPropertyNames("%")ます。これは、メッセージに「存在しない」プロパティの名前が返されるためです。GetObjectProeprtyそのような名前で呼び出すとMQException、理由コード 2471 が返されMQRC_PROPERTY_NOT_AVAILABLEます。

プロパティをダンプするための私のメソッドの簡略化されたコードは次のとおりです。

private static void DumpMessageProperties(MQMessage message, StringBuilder dumpBuilder) {
    IEnumerator names = message.GetPropertyNames("%");
    dumpBuilder.AppendLine("Properties:");
    while (names.MoveNext()) {
        string name = names.Current.ToString();
        dumpBuilder.AppendFormat("  {0}: ", name);

        try {
            object value = message.GetObjectProperty(name);

            if (value != null) {
                Type type = value.GetType();
                if (type != typeof(sbyte[])) {
                    if (type == typeof(string)) {
                        string strValue = value.ToString();
                        dumpBuilder.Append(String.Format("\"{0}\" [{1}]", strValue, type));
                    } else {
                        dumpBuilder.Append(String.Format("{0} [{1}]", value, type));
                    }
                } else {
                    dumpBuilder.Append(String.Format("{0}", DumpSByteArray((sbyte[])value)));
                }
            }
        } catch (MQException e) {
            dumpBuilder.AppendFormat("{0} ({1})", e.Message, e.ReasonCode.ToString());
        }

        dumpBuilder.AppendLine();
    }
}

MQRC_PROPERTY_NOT_AVAILABLE受信または送信されたメッセージのユーザー プロパティをダンプするときに時々取得します。受信メッセージの失敗したダンプの例:

Properties:
  JMSReplyTo: "queue:///SomeQueue" [System.String]
  Encoding: MQRC_PROPERTY_NOT_AVAILABLE (2471)
  JMSDeliveryMode: 0 [System.Int32]
  CodedCharSetId: MQRC_PROPERTY_NOT_AVAILABLE (2471)
  JMSDestination: "queue:///SomeReplyQueue" [System.String]
  MessageVersion: "001" [System.String]
  mcd.Msd: "jms_text" [System.String]
  MessageName: "SomeMessageName" [System.String]

MQRFH2 ヘッダーからの制御フィールドが何らかの形でメッセージに渡されているようです。クライアントが自動的に MQRFH2 メッセージ形式を処理し、翻訳してくれると思っていました。

送信されたメッセージの失敗したダンプの例:

Properties:
  JMSTimestamp: MQRC_PROPERTY_NOT_AVAILABLE (2471)
  mcd.Msd: 
  JMSDestination: MQRC_PROPERTY_NOT_AVAILABLE (2471)
  JMSReplyTo: MQRC_PROPERTY_NOT_AVAILABLE (2471)
  JMSDeliveryMode: 1 [System.Int32]

なぜこうなった?ドキュメントでエラーを確認しましたが、エラーを回避してそれらのデータを取得する方法や、メッセージの一部であってはならないプロパティ ( のようEncodingなRFH コントロール フィールドCodeCharSetId) を削除する方法がまだわかりません。

これはMQMessage矛盾した状態にあるようです。

4

1 に答える 1