我真的是WebSphere MQ的新手,但我有一个关于MQMessage API的问题。 似乎MQMessage的接收者应事先知道:
对我来说没有意义。因为如果我不熟悉消息结构,我应该探索所有选项,直到我检索其中的数据?
帮助将不胜感激, 盖
答案 0 :(得分:3)
是的,如果邮件是结构化数据(如固定长度的记录格式),则必须事先知道邮件的格式以便解析它。另一方面,如果消息有效负载是标记的数据结构(例如有效的XML),那么您将使用正常的解析来访问它。例如,您可以使用XPath来访问XML有效负载,而无需先了解确切的结构。
您提到的方法(WriteInt,ReadInt等)通常用于从已知格式中提取数据并将缓冲区指针前进到下一个字段。但是,也有读取和写入UTF字符串的方法。如果由于某种原因,您的应用程序必须处理各种消息类型,那么您可以通过查询消息描述符来查询消息格式和消息类型。执行此操作的方法记录在Message descriptor fields as properties中。通过这种方式,您可以区分不同类型和格式的消息并适当地解析它们。
请注意,我上面链接的文档是v7 .Net类。由于v6的生命周期结束时间是2011年9月,所以希望新开发的是v7类,最好连接到v7 QMgr。
修改 - 对评论的回复
检查消息格式的示例:
根据上面链接的页面,检查MQ头文件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 is described here但由于它没有方法,因此页面只引用您定义的WMQ常量列表。那页is here。