예제 IMS 프로그램 코드

EGL 프로그램의 해당 발췌는IMS™ 터미널, 메시지 큐, 연속 파일과의 상호작용을 표시합니다.

메시지 큐와 연관된 연속 파일에 대한 출력 예제

다음은 메시지 큐에 액세스하는 EGL 프로그램의 일부 코드 발췌입니다. 프로그램이 다음 태스크를 수행합니다.
  1. 양식을 사용하여 터미널에서 입력을 요청합니다.
  2. 응답을 읽습니다.
  3. 사용자 입력 기반의 정보로 연속 레코드를 업데이트합니다.
  4. 나중의 일괄처리 처리를 위해 다른 트랜잭션으로 직렬 레코드를 출력합니다.
프로그램은 IMS 환경에서 다음 연관을 가정합니다.
  • IMS 트랜잭션 코드 MYTRXCD1은 MYTRXCD1으로 이름 지정된 PSB와 연관됩니다.
  • IMS 트랜잭션 코드는 NEXTTRX MYTRXCD2로 이름 지정된 PSB와 연관됩니다.
// PSB 정의
Record addToQueue type PSBRecord { defaultPSBName="MYTRXCD1" }
   // IMS에서 CBLTDLI에 필요한 세 개의 PCB
   iopcb IO_PCBRecord { @PCB { pcbType = TP } };
   elaalt ALT_PCBRecord { @PCB { pcbType = TP } };
   elaexp ALT_PCBRecord { @PCB { pcbType = TP } };
   // 기타 데이터베이스 PCB
   ...
end

Record myTransactionPart type serialRecord
   { fileName="MYMSGQUE" }
   ...
end
program addtrans type textUIProgram
   { alias = "MYTRXCD1",           // IMS는 pgm이 PSB 이름과 일치하도록 요구함
      segmented = yes,
      @DLI { psb = "mypsb" }}

use MYFORMS;  // MYFORMS는 FORM1이 포함된 formGroup임

// 변수 선언
myTransaction myTransactionPart;  // 메시지 큐의 연속 레코드
mypsb addToQueue;                 // psb

   function main()
      ...
      converse FORM1;  
      // 처리가 필요한 모든 사항 수행
      move FORM1 to myTransaction byName;
      add myTransaction;
      ...
   endend
생성 시, 메시지 큐가 있는 연속 파일과 연관되고 사용할 PCB 이름과 함께 전송될 트랜잭션 이름을 제공하는 자원 연관 파트를 지정해야 합니다. 나중에 설명한 바와 같이 일괄처리 프로그램에 의해 메시지 큐 데이터를 입력할 수 있는 연관 요소를 포함한 다음 예제를 고려해 보십시오.
<ResourceAssociations name="IMS_RESOURCE_ASSOCIATION">
   <association fileName="MYMSGQUE">
      <imsvs>
         <smsgq systemName="NEXTTRX" pcbName="elaalt"/>
      </imsvs>
   </association>   
   <association fileName="MYINQUE">
      <imsvs>
         <smsgq systemName="NEXTTRX" pcbName="iopcb"/>
      </imsvs>
   </association>
</ResourceAssociations>

addtrans는 textUI 프로그램이므로 EGL은 IMS 환경에 대한 인터페이스에 제어 로직을 생성합니다. IMS 프로그램은 큐가 빌 때까지 입력 메시지 큐를 읽습니다. 따라서 EGL은 프로그램이 현재 사용자에 응답하거나(converse 또는 show 문 사용) 응답 책임을 전송한 후(transfer to transaction 문 사용) 프로그램이 루프를 실행하여 큐에서 다음 입력 메시지를 읽도록 프로그램에 로직을 생성합니다. 개요는 IMS에서 터미널과 상호작용의 내용을 참조하십시오. 자세한 정보는 이 주제의 "다중 사용자 및 메시지 큐"를 참조하십시오.

IMS 일괄 처리의 예제

또한 프로그램 addtrans가 메시지 큐에 쓰는 메시지를 처리하는 프로그램을 작성할 수 있습니다. 이 프로그램은 연속 파일에서 레코드를 가져오고 연속 파일과 I/O PCB를 연관시키는 기본 프로그램이어야 합니다.

프로그램은 addtrans가 사용했지만 서로 다른 PCB 이름이 필요하여 새 파일 이름을 갖는 동일한 연속 레코드를 사용할 수 있습니다. 다음 예제에서 주요 변경사항을 굵게 표시합니다.
// PSB 정의
Record getFromQueue type PSBRecord { defaultPSBName="MYTRXCD2" }
   // IMS에서 CBLTDLI에 필요한 세 개의 PCB
   iopcb IO_PCBRecord { @PCB { pcbType = TP } }
   elaalt ALT_PCBRecord { @PCB { pcbType = TP } };
   elaexp ALT_PCBRecord { @PCB { pcbType = TP } };
   // 기타 데이터베이스 PCB
end
program gettrans type basicProgram
   { alias = "MYTRXCD2"
      @DLI { psb = "mypsb" }}

// 변수 선언
myTransaction myTransactionPart             // 메시지 큐의 연속 레코드
   {fileName="MYINQUE"};  
mypsb getFromQueue;               // psb

   function main()
      while (myTransaction not endOfFile)
         get next myTransaction;
      // 처리가 필요한 모든 사항 수행
      end   endend

IMS/VS 또는 IMS BMP 환경에 대한 프로그램을 생성하는 경우 연속 파일을 메시지 큐와 연관시키는 자원 연관 파트 및 사용할 PCB의 이름을 지정해야 합니다. 이 경우 이전 섹션의 ResourceAssociations 파트에서 표시된 대로 입력에 I/O PCB가 사용됩니다. systemName 특성은 선택사항입니다. 프로그램은 IMS 시스템 정의를 기반으로 프로그램을 시작한 트랜잭션과 연관된 메시지 큐를 읽습니다. EGL은 입력 메시지의 IMS 트랜잭션 ID를 기반으로 sysVar.transactionID를 설정합니다.

다중 사용자 및 메시지 큐

EGL 프로그램을 쓸 때 단일 터미널에서 단일 사용자를 위해 수행해야 하는 처리만 고려하면 됩니다. EGL은 자원에 대한 경합에서 여러 사용자가 있는 경우 IMS에서 복잡한 상황을 처리하기 위해 프로그램에 제어 로직을 생성합니다. USER1과 USER2 모두 해당 터미널에서 동시에 MYTRXCD1을 입력한다고 가정합니다. USER1의 트랜잭션 코드가 MYTRXCD1과 연관된 메시지 큐에서 먼저 종료된다고 가정합니다.
  1. IMS는 트랜잭션 코드 MYTRXCD1과 연관된 PSB를 스케줄합니다. 해당 PSB에 MYTRXCD1이라는 이름이 지정됩니다(필수적인 것은 아닙니다). 그러나 PSB와 연관된 프로그램은 IMS의 PSB와 동일한 이름이어야 합니다. 그러므로 IMS는 프로그램 MYTRXCD1(EGL에 addtrans로 알려짐)을 로드합니다.
  2. 프로그램 MYTRXCD1의 EGL 생성 제어 로직은 프로그램이 최초로 USER1에 대해 호출되었음을 판별하여 맨 위에서 처리를 시작합니다.
  3. 결과적으로 프로그램이 converse 문에 도달하고 다음 조치를 수행합니다.
    • 프로그램이 사용하는 모든 레코드 및 양식에 대한 데이터를 저장합니다.
    • 프로그램에서 converse 문이 발생한 위치에 관한 정보를 저장합니다.
    • 지정된 양식으로 ISRT 명령을 수행합니다.
  4. EGL이 추가한 로직에 따라 프로그램은 처음으로 루프백하여 메시지 큐에서 대기하는 USER2를 찾습니다. 프로그램은 USER2에 USER1의 경우와 같은 단계를 수행하여 converse 문에 도달하고 양식을 전송한 후 루프백하여 메시지 큐를 다시 확인합니다.
  5. 여기에서 프로그램이 converse 문에 대한 USER1의 응답을 찾을 수 있습니다. EGL 생성 제어 로직은 이 응답이 USER1 처리의 연속임을 판별하고 다음을 수행합니다.
    • USER1의 데이터를 복원합니다(converse 문의 위치 포함).
    • 여러 시스템 변수를 새로 고칩니다.
    • FORM1이 요청한 유효성 검증 확인을 실행합니다.
    • 입력 오류가 없다는 가정 하에 converse 문 다음에 오는 명령문에서 처리를 재개합니다.
  6. 결과적으로 프로그램은 다른 converse 문에 도달하고 모든 데이터를 저장한 후 USER1에 응답을 전송합니다. 그런 다음 프로그램이 루프백하여 메시지 큐를 다시 확인합니다.
  7. USER2가 점심 식사를 하러 가고 트랜잭션 코드 MYTRXCD1과 연관된 메시지 큐에 아무것도 없다고 가정합니다. 프로그램 MYTRXCD1이 종료됩니다.
  8. 이후, USER1이 가장 최근의 콘솔 메시지에 응답하게 되면 IMS는 다시 트랜잭션 코드 MYTRXCD1과 연관된 큐에 메시지를 갖게되고 프로그램 MYTRXCD1을 다시 시작합니다. EGL 생성 제어 로직은 이 응답이 USER1 처리의 연속임을 판별하고 모든 데이터를 복원한 후 처리를 계속합니다.