Исследование MQMessage (с использованием WebSphere MQ .NET API) - PullRequest
2 голосов
/ 21 декабря 2010

Я действительно новичок в WebSphere MQ, но у меня есть один вопрос, касающийся MQMessage API. Похоже, что получатель MQMessage должен знать заранее:

Тип написанного сообщения (если WriteInt, ReadInt и т. Д.) Имена и типы свойств (если SetBooleanProperty (Name), то GetBooleanProperty (Name))

Это не имеет смысла для меня. Так как, если я не знаком со структурой сообщения, я должен изучить все варианты, пока не получу данные в ней?

Помощь будет оценена, Guy

1 Ответ

3 голосов
/ 22 декабря 2010

Да, вы абсолютно правы в том, что если сообщение представляет собой структурированные данные, такие как формат записи фиксированной длины, вы должны заранее знать формат сообщения, чтобы проанализировать его. С другой стороны, если полезная нагрузка сообщения помечена как структура данных (например, действительный 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, которые она определяет. Эта страница здесь .

...