私は WebSphere MQ の初心者ですが、MQMessage API に関して 1 つ質問があります。MQMessage の受信者は事前に知っておく必要があるようです。
私には意味がありません。メッセージ構造に慣れていない場合は、データを取得するまですべてのオプションを検討する必要がありますか?
助けていただければ幸いです、ガイ
私は WebSphere MQ の初心者ですが、MQMessage API に関して 1 つ質問があります。MQMessage の受信者は事前に知っておく必要があるようです。
私には意味がありません。メッセージ構造に慣れていない場合は、データを取得するまですべてのオプションを検討する必要がありますか?
助けていただければ幸いです、ガイ
はい、メッセージが固定長レコード形式などの構造化データである場合、メッセージを解析するには、メッセージの形式を事前に知っておく必要があることは間違いありません。一方、メッセージペイロードがタグ付けされたデータ構造(有効なXMLなど)である場合は、通常の解析を使用してアクセスします。たとえば、最初に正確な構造を知らなくても、XPathを使用してXMLペイロードにアクセスできます。
あなたが言及するメソッド(WriteInt、ReadIntなど)は通常、既知の形式からデータを抽出し、バッファーポインターを次のフィールドに進めるために使用されます。ただし、UTF文字列を読み書きする方法もあります。何らかの理由でアプリケーションがさまざまなメッセージタイプを処理する必要がある場合は、メッセージ記述子を照会することにより、メッセージ形式とメッセージタイプについて問い合わせることができます。これを行う方法は、プロパティとしてメッセージ記述子フィールドに文書化されています。このようにして、メッセージのさまざまなタイプと形式を区別し、それらを適切に解析できます。
上でリンクしたドキュメントはv7.Netクラスにあることに注意してください。v6のサポート終了は2011年9月であるため、新しい開発はすべてv7クラスで行われ、できればv7QMgrに接続することが望まれます。
編集-コメントへの応答
メッセージ形式の確認例:
上記のリンク先のページに従って、Cヘッダーファイルcmqc.hでMQMDのフィールドを確認します。これにより、フィールド名とフィールドタイプがわかります。デフォルトのWindowsインストールでは、このファイルは次の場所にあります。
C:\Program Files\IBM\WebSphere MQ\tools\c\include\cmqc.h
したがって、たとえば、message.getStringProperty('Root.MQMD.Format')
メッセージ形式を返します。cmqc.hの上部近くに、MQFMT_という名前のマクロのリストとMQMDフォーマットフィールドの可能な値があります。v7.01の時点では、次のようになっています。
/* Formats */
#define MQFMT_NONE " "
#define MQFMT_ADMIN "MQADMIN "
#define MQFMT_CHANNEL_COMPLETED "MQCHCOM "
#define MQFMT_CICS "MQCICS "
#define MQFMT_COMMAND_1 "MQCMD1 "
#define MQFMT_COMMAND_2 "MQCMD2 "
#define MQFMT_DEAD_LETTER_HEADER "MQDEAD "
#define MQFMT_DIST_HEADER "MQHDIST "
#define MQFMT_EMBEDDED_PCF "MQHEPCF "
#define MQFMT_EVENT "MQEVENT "
#define MQFMT_IMS "MQIMS "
#define MQFMT_IMS_VAR_STRING "MQIMSVS "
#define MQFMT_MD_EXTENSION "MQHMDE "
#define MQFMT_PCF "MQPCF "
#define MQFMT_REF_MSG_HEADER "MQHREF "
#define MQFMT_RF_HEADER "MQHRF "
#define MQFMT_RF_HEADER_1 "MQHRF "
#define MQFMT_RF_HEADER_2 "MQHRF2 "
#define MQFMT_STRING "MQSTR "
#define MQFMT_TRIGGER "MQTRIG "
#define MQFMT_WORK_INFO_HEADER "MQHWIH "
#define MQFMT_XMIT_Q_HEADER "MQXMIT "
実際のMQMD構造は、cmqc.hの下部近くに定義されています。v7.0.1の時点では、次のようになります。
/****************************************************************/
/* MQMD2 Structure -- Version-2 Message Descriptor */
/****************************************************************/
typedef struct tagMQMD2 MQMD2;
typedef MQMD2 MQPOINTER PMQMD2;
struct tagMQMD2 {
MQCHAR4 StrucId; /* Structure identifier */
MQLONG Version; /* Structure version number */
MQLONG Report; /* Report options */
MQLONG MsgType; /* Message type */
MQLONG Expiry; /* Expiry time */
MQLONG Feedback; /* Feedback or reason code */
MQLONG Encoding; /* Numeric encoding of message data */
MQLONG CodedCharSetId; /* Character set identifier of message
data */
MQCHAR8 Format; /* Format name of message data */
MQLONG Priority; /* Message priority */
MQLONG Persistence; /* Message persistence */
MQBYTE24 MsgId; /* Message identifier */
MQBYTE24 CorrelId; /* Correlation identifier */
MQLONG BackoutCount; /* Backout counter */
MQCHAR48 ReplyToQ; /* Name of reply-to queue */
MQCHAR48 ReplyToQMgr; /* Name of reply queue manager */
MQCHAR12 UserIdentifier; /* User identifier */
MQBYTE32 AccountingToken; /* Accounting token */
MQCHAR32 ApplIdentityData; /* Application data relating to
identity */
MQLONG PutApplType; /* Type of application that put the
message */
MQCHAR28 PutApplName; /* Name of application that put the
message */
MQCHAR8 PutDate; /* Date when message was put */
MQCHAR8 PutTime; /* Time when message was put */
MQCHAR4 ApplOriginData; /* Application data relating to
origin */
MQBYTE24 GroupId; /* Group identifier */
MQLONG MsgSeqNumber; /* Sequence number of logical message
within group */
MQLONG Offset; /* Offset of data in physical message
from start of logical message */
MQLONG MsgFlags; /* Message flags */
MQLONG OriginalLength; /* Length of original message */
};
cmqc.hファイルは、表示されている各フィールドのマクロを定義し、これらには可能な値が含まれます。これらのマクロは、.NetクラスでもMQCオブジェクトとして定義されています。MQCについてはここで説明しますが、メソッドがないため、このページでは、MQCが定義するWMQ定数のリストを参照するだけです。そのページはここにあります。