Отсылка IMS триггеров из PL/I

Сегодня я предлагаю поговорить о ситуациях, когда требуется отправить 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

Экспериментируйте!