Сегодня я предлагаю поговорить о ситуациях, когда требуется отправить 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
Экспериментируйте!
и нужно ли инициализировать
и нужно ли инициализировать ims базу после создания?
База должна быть прописана в
База должна быть прописана в IMS и запущена, насколько я помню, /sta db командой
что то не сильно понятно, как
что то не сильно понятно, как записывать данные в ims базу. что почитать?
вероятно, нужно использовать
вероятно, нужно использовать PLITDLI и INSERT, но как конкретно не ясно
Вот смотрите, я сделал
Вот смотрите, я сделал DBDGEN, PSBGEN. как теперь получить данные из базы ims средством pl
Для работы с базами нужно
Для работы с базами нужно добавить объявление в PSB
xxxx- имя базы
opt - опции работы
nn - длина ключа
yyyy - корневой сегмент
А в самой программе доступ к базе осуществляется через функцию PLITDLI
CALL PLITDLI (4, GN, PCBPOINTER, ADDR(DATA_STRUCTURE), KET_STRUCTURE);
4 - кол-во параметров
GN - имя функции, в этом примере Get Next, GU = Get Unique
PCBPOINTER - указатель на базу из PSB
DATA_STRUCTURE - структура, в которую будут записываться данные
KET_STRUCTURE - струкутура с параметрами доступа. В ней указываться имя сегмента, а также можно указать ключ для вычитки определенной записи или поиска по критериям, например
OPER и VALUE нужно установить до доступа к таблице. Можно просто оставить имя сегмента и тогда будут вычитаны все записи.
PRINT NOGEN PCB
print nogen
pcb type=db,dbdname=libdbd,keylen=11,procopt=g
senseg name=vendrseg
senseg name=son,parent=vendrseg
psbgen psbname=libpsb,lang=pl/1
end
определенно, я сделал psb.
т.е. вначале записываем call plitdli (4, gn, pcbpointer, addr(data_structure), ket_structure);
а потом, если нужно декларируем ket_structure?
Декларирование и
Декларирование и инициализация ket_structure должна быть произведена до вызова plitdli
Отправить комментарий