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



              

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


Для пояснения изложенного следует привести фрагмент программы, использующей вывод сообщений в виде группы.

if ((CompCode == MQCC_OK) || (CompCode == MQCC_WARNING)) { pmo.Options = MQPMO_LOGICAL_ORDER + MQPMO_SYNCPOINT ; memcpy(md.GroupId, "1", sizeof(md.GroupId)); memcpy(md. MsgFlags, "MQMF_MSG_IN_GROUP", sizeof(md. MsgFlags));

//memcpy(md.MsgSeqNumber, 1, // sizeof(md.MsgSeqNumber)); //memcpy(md.MsgFlags, MQMF_SEGMENT, // sizeof(md.MsgFlags));

/* блок формирования buffer */ MQPUT1(Hcon, &odR, &md, &pmo, messlen, buffer, &CompCode, &Reason); if (Reason != MQRC_NONE) printf("MQPUT1 ended with reason code %ld\n", Reason); } /* конец цикла чтения поступающих сообщений */

memcpy(md. MsgFlags, "MQMF_ LAST_MSG_IN_GROUP", sizeof(md. MsgFlags));

/* блок формирования buffer */ MQPUT1(Hcon, &odR, &md, &pmo, messlen, buffer, &CompCode, &Reason); if (Reason != MQRC_NONE) printf("MQPUT1 ended with reason code %ld\n", Reason);

Группа сообщений и сегментация сообщения

Рис. 11.1.  Группа сообщений и сегментация сообщения

Процесс извлечения группы логических сообщений из очереди командой MQGET во многом будет зависеть от значений, заданных в опции GMO. Если задать значение MQGMO_ALL_MSGS_AVAILABLE, то сообщения будут доступны для чтения только, когда все сообщения группы поступят в очередь. Если задана опция MQGMO_LOGICAL_ORDER, то сообщения можно извлекать в порядке, определяемом MsgSeqNumber и только по одному сообщению из группы. Если опция MQGMO_LOGICAL_ORDER не задана, то приложение должно выбирать сообщения двумя способами:

  1. на основе корректных GroupId и MsgSeqNumber, либо переключаться на MQGMO_LOGICAL_ORDER, либо переслать сообщения дальше.
  2. на основе опций соответствия MatchOption, если они заданы:
    • MQMO_MATCH_MSG_ID,
    • MQMO_MATCH_CORREL_ID,
    • MQMO_MATCH_GROUP_ID,
    • MQMO_MATCH_MSG_SEQ_NUMBER.

    Например, опция CORREL_ID означает, что должно выбираться сообщение, корреляционный идентификатор которого, соответствует значению поля CorrelId параметра MsgDesc функции MQGET. Это согласование является дополнением к любому другому соответствию, заданному в MatchOption. Если корреляционный идентификатор есть MQCI_NONE, то это равносильно тому, что опция MQMO_MATCH_CORREL_ID не определена.




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