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


Программа rewriter (модель "один к одному") - часть 4


MQGET(Hcon, Hobj, &md, &gmo, buflen, buffer, &messlen, &CompCode, &Reason); if ((CompCode == MQCC_OK) || (CompCode == MQCC_WARNING)) { buffer[messlen] = '\0'; /* заносим символ конец строки в буфер с прочитанным сообщением */ buflen = messlen; MQPUT(Hcon, Hout, &md, &pmo, buflen, buffer, &CompCode, &Reason); if ((CompCode == MQCC_OK) || (CompCode == MQCC_WARNING)) { tmr = time(NULL); strcpy ( buf, ctime(&tmr)); buf[strlen(buf)-1]=0; // переход к новой строке Reason = fprintf( fp, "%s: %s\n", buf, buffer ); } } /* конец обработки входного сообщения */ } /* конец цикла чтения/записи сообщений функциями MQGET, MQPUT */

fclose (fp); C_options = 0; /* нет никаких опций при закрытии */ MQCLOSE(Hcon, &Hobj, C_options, &CompCode, &Reason); /* закрываем очередь для чтения */ if (Reason != MQRC_NONE) {printf("MQCLOSE (input) ended with reason code %ld\n", Reason); }

MQCLOSE(Hcon, &Hout, C_options, &CompCode, &Reason); /* закрываем очередь для записи */ if (Reason != MQRC_NONE) {printf("MQCLOSE (output) ended with reason code %ld\n", Reason); }

if (CReason != MQRC_ALREADY_CONNECTED) { MQDISC(&Hcon, &CompCode, &Reason); if (Reason != MQRC_NONE){ printf("MQDISC ended with reason code %ld\n", Reason); } }

return(0); }

Листинг 9.1. Rewriter C program pass messages to output queue

В данной версии мы выходим из цикла программы по опции gmo.WaitInterval = 3000, когда ожидаем сообщение в очереди в течении 3 сек, а его там нет (опция gmo.WaitInterval работает быстрее, чем если бы мы опрашивали очередь по собственному временному циклу). Другой вариант программы может быть таким. Задаем gmo.WaitInterval = MQWI_UNLIMITED; что соответствует gmo.WaitInterval= -1. Программа будет крутиться "бесконечно" до тех пор, пока мы не остановим её принудительно, например, нажатием клавиш CNTRL_C (стандартный останов). В этом случае нужно добавить обработчик прерываний по нажатию CNTRL_C потому, что при таком выходе объекты очереди останутся не закрытыми и идентификаторы объектов окажутся "зависшими" в виртуальной памяти компьютера. А это может привести к тому, что при повторном запуске программы эти "зависшие" идентификаторы будут мешать нормальному функционированию программы. Во втором варианте открытие и закрытие лог-файла необходимо также делать в обработчике прерываний или после каждой команды MQPUT, в противном случае лог-файл не будет формироваться. Следует отметить, что размер массива buffer ограничивает длину сообщения 8Кб и при появлении сообщений большей длины следует увеличить размер буфера.




Начало  Назад  Вперед



Книжный магазин