Отсылка 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

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

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

и нужно ли инициализировать 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.