Отсылка 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 Экспериментируйте!Air Max 1 Ultra Moire

и нужно ли инициализировать

и нужно ли инициализировать ims базу после создания?

База должна быть прописана в

База должна быть прописана в IMS и запущена, насколько я помню, /sta db командой

что то не сильно понятно, как

что то не сильно понятно, как записывать данные в ims базу. что почитать?

вероятно, нужно использовать

вероятно, нужно использовать PLITDLI и INSERT, но как конкретно не ясно

Вот смотрите, я сделал

Вот смотрите, я сделал DBDGEN, PSBGEN. как теперь получить данные из базы ims средством pl

Для работы с базами нужно

Для работы с базами нужно добавить объявление в PSB

PCB   TYPE=DB,DBDNAME=xxxx,PROCOPT=opt,KEYLEN=nn             
SENSEG NAME=yyyy,PARENT=0                                  

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 - струкутура с параметрами доступа. В ней указываться имя сегмента, а также можно указать ключ для вычитки определенной записи или поиска по критериям, например

DCL 1 KET_STRUCTURE  UNALIGNED,             
      3 SEGNAME   CHAR(08)  INIT('ROOTSEGM'),
      3 BRACK1    CHAR(01)  INIT('(')      , 
      3 FIELD     CHAR(08)  INIT('KEY    '), 
      3 OPER      CHAR(02)  INIT('= ')     , 
      3 VALUE     CHAR(58)  INIT('')       , 
      3 BRACK2    CHAR(01)  INIT(')')      ; 

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

Отправить комментарий

  • Доступны HTML теги: <b> <i> <u> <br> <hr> <div> <span> <code> <pre>
  • Строки и параграфы переносятся автоматически.
  • You can enable syntax highlighting of source code with the following tags: <code>, <pli>.

Подробнее о форматировании

  _    ___  
/ | ( _ )
| | / _ \
| | | (_) |
|_| \___/
Enter the code depicted in ASCII art style.