Интеграция приложений на основе WebSphere MQ



              

Группировка и сегментация сообщений - часть 4


Реассемблирование с помощью приложения осуществляется, если при чтении сообщений командой MQGET была задана GMO-опция: MQGMO_COMPLETE_MESSAGE и флажок MsgFlags имеет значение MQMF_SEGMENTATION_ALLOWED. В этом случае приложение извлекает сегменты самостоятельно в зависимости от ограничений на свой размер буфера. Опции MQGMO_ALL_MSGS_AVAILABLE и MQGMO_ALL_SEGMENTS_AVAILABLE позволят начать работу, если все сообщения или все сегменты поступят в очередь. Как только первое сообщение поступит в очередь, можно использовать MQGMO_LOGICAL_ORDER опцию, чтобы быть уверенным, что все последующие сегменты логического сообщения будут обработаны. Если опция MQGMO_LOGICAL_ORDER не задана, то приложение может выбирать сообщения на основе опций соответствия MatchOption, как это делалось для групп:

  • MQMO_MATCH_MSG_ID,
  • MQMO_MATCH_CORREL_ID,
  • MQMO_MATCH_GROUP_ID,
  • MQMO_MATCH_MSG_SEQ_NUMBER,
  • MQMO_MATCH_OFFSET.

Приложение может определить окончание работы с сегментом с помощью возвращаемого MQGET значения поля MQGMO.SegmentStatus, которое может принимать следующие значения: MQSS_SEGMENT, MQSS_LAST_SEGMENT, MQSS_NOT_A_SEGMENT.

В завершение раздела можно привести примеры использования функций MQPUT и MQGET для вывода и чтения логических сообщений в соответствии с их структурой, указанной на рис.11.1.

/* пример использования функции MQPUT */ PMO.Options = MQGMO_LOGICAL_ORDER + MQGMO_SYNCPOINT

/* помещаем в очередь первое логическое сообщение*/ MQPUT (MQMF_MSG_IN GROUP + MQMF_SEGMENT) MQPUT (MQMF_MSG_IN GROUP + MQMF_SEGMENT) MQPUT (MQMF_MSG_IN GROUP + MQMF_LAST_SEGMENT)

/* помещаем в очередь второе логическое сообщение */ MQPUT (MQMF_MSG_IN GROUP + MQMFSEGMENT)

/* помещаем в очередь третье логическое сообщение */ MQPUT (MQMF_LAST_MSG_IN GROUP + MQMF_SEGMENT) MQPUT (MQMF_ LAST_MSG_IN GROUP + MQMF_LAST_SEGMENT) MQCMIT

/* пример использования функции MQGET */ GMO.Options = MQGMO_LOGICAL_ORDER + MQGMO_SYNCPOINT + MQGMO_ALL_MSGS_AVAILABLE + MQGMO_WAIT Do while (Not MQGS_LAST_MSG_IN GROUP and Not MQSS_LAST_SEGMENT) MQGET (........) /* обработка сегмента или законченного логического сообщения */ End MQCMIT




Содержание  Назад  Вперед