Да, вы абсолютно правы в том, что если сообщение представляет собой структурированные данные, такие как формат записи фиксированной длины, вы должны заранее знать формат сообщения, чтобы проанализировать его. С другой стороны, если полезная нагрузка сообщения помечена как структура данных (например, действительный XML), то для доступа к ней вы будете использовать обычный синтаксический анализ. Например, вы можете использовать XPath для доступа к полезной нагрузке XML без предварительного знания точной структуры.
Методы, которые вы упоминаете (WriteInt, ReadInt и т. Д.), Обычно используются для извлечения данных из известного формата и перемещения указателя буфера к следующему полю. Однако есть также методы для чтения и записи строк UTF. Если по какой-либо причине ваше приложение должно обрабатывать различные типы сообщений, вы можете узнать формат сообщения и тип сообщения, запросив дескриптор сообщения. Метод для этого задокументирован в Полях дескриптора сообщения как свойства . Таким образом, вы можете различать различные типы и форматы сообщений и анализировать их соответствующим образом.
Обратите внимание, что приведенные выше документы относятся к классам v7 .Net. Поскольку конец 6-й версии v6 - сентябрь 2011 года, есть надежда, что все новые разработки будут реализованы в классах v7 и предпочтительно подключаться к v7 QMgr.
Правка - Ответ на комментарии
Пример проверки формата сообщения:
Согласно странице, указанной выше, проверьте файл заголовка 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 описывается здесь , но поскольку у него нет методов, страница просто ссылается на список констант WMQ, которые она определяет. Эта страница здесь .