Сегодня я предлагаю поговорить о ситуациях, когда требуется отправить IMS сообщение MPP процессу из программы, написанной на PL/I.
Работа с IMS очередями (и, в принципе, с IMS) осуществляется при помощи внешней процедуры PLITDLI:
DCL PLITDLI EXTERNAL ENTRY;
Для отсылки сообщения нам потребуется выполнить три команды:
1. Установка альтернативного PCB на требуемую IMS очередь.
2. Запись сообщения в IMS очередь.
3. Отсылка сигнала о том, что сообщение готово к отсылке (так называемый purge).
Процедура PLITDLI вызывается с переменным числом параметров. В качестве первого параметра Вам необходимо передать количество остальных параметров.
Для передачи этого количество слудет использовать статичные целочисленные переменные длиной 4 байта:
DCL TWO FIXED BIN(31) STATIC INIT(2); DCL THREE FIXED BIN(31) STATIC INIT(3); DCL FOUR FIXED BIN(31) STATIC INIT(4);
Общий вид IMS сообщения выглядит следующим образом:
DCL 1 IMS_TRIGGER, 3 QTRNTRL FIXED BIN(31) INIT(CSTG(IMS_TRIGGER)), 3 CTRNIZZ FIXED BIN(15) INIT(0), 3 ITRNCOD CHAR(8), 3 MSGDATA CHAR(992);
Назначение полей:
- QTRNTRL - длина сообщения;
- CTRNIZZ - не используется;
- ITRNCOD - имя MPP IMS транзакции;
- MSGDATA - "тело" сообщения.
Итак, для установка альтернативного PCB на требуемую IMS очередь, нужно выполнить:
CALL PLITDLI (THREE, 'CHNG', ALT_PCB, IMS_TRIGGER.ITRNCOD);
Предполагается, что IMS_TRIGGER.ITRNCOD уже содержит имя требуемой транзакции.
ALT_PCB - альтернативный изменяемый PCB Вашей программы (TYPE=TP,MODIFY=YES,EXPRESS=NO)
Для записи сообщения в IMS очередь, нужно выполнить:
CALL PLITDLI (THREE, 'ISRT', ALT_PCB, ADDR(IMS_TRIGGER));
Предполагается, что структура IMS_TRIGGER уже заполнена.
Для выполнения последнего шага отсылки используем:
CALL PLITDLI (TWO , 'PURG', ALT_PCB);
PSB Вашей программы должно содержать в себе обьявление альтернативного изменяемого PCB:
*********************************************************************** ** PSB NAME: MYPGMPSB *********************************************************************** * I/O PCB (BUILT AUTOMATICALLY) *********************************************************************** * ALTERNATE PCB FOR ABEND MESSAGES *********************************************************************** PCB TYPE=TP,MODIFY=YES,EXPRESS=YES *********************************************************************** * END OF PSB *********************************************************************** PSBGEN LANG=PL/I, X CMPAT=YES, X PSBNAME=MYPGMPSB END
Экспериментируйте!
