受信したプロパティの読み取りに大きな問題があります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
矛盾した状態にあるようです。