アプリケーションの作成

本章では、アプリケーション・プログラムを作成する方法について説明します。

1. アプリケーションの作成手順

アプリケーションを作成する手順は、アプリケーションの設計、プログラミング、デバッグ、実行に分けられます。

各ステップには、OSIで定義する必要があるリソースと、ユーザーが任意で作成するプログラミングが含まれます。

1.1. アプリケーションの設計

アプリケーションの設計は、以下の手順で行われます。

  1. 開発者は、アプリケーションが実行されるユーザー・サーバーのタイプを決定する必要があります。

    アプリケーションを処理するユーザー・サーバーには、MPPユーザー・サーバーとBMPユーザー・サーバーがあります。この2つのサーバー・タイプからアプリケーションが実行される方法を選択します。

  2. サーバーのタイプが決定したら、アプリケーションとユーザーサーバー間の関係を定義する必要があります。

    アプリケーションとユーザー・サーバーの関係は、システム・リソース定義(System Resource Definition)で定義します。

    以下は、システム定義の例です。

    APPLCTN PSB=OIVPI001,PGMTYPE=(,,),SCHDTYP=PARALLEL
    TRANSACT CODE=OIVPMPP1,MSGTYPE=(SNGLSEG,RESPONSE,1),PRTY=(1,5),        X
            MODE=SNGL
    APPLCTN PSB=OIVPI002,PGMTYPE=(TP,,1),SCHDTYP=PARALLEL
    TRANSACT CODE=OIVPMPP2,MSGTYPE=(SNGLSEG,RESPONSE,1),PRTY=(1,5),        X
            MODE=SNGL,MAXRGN=1
    
    APPLCTN PSB=OIVPIL05,PGMTYPE=BATCH,SCHDTYP=PARALLEL
    TRANSACT CODE=OIVPBMP5,MSGTYPE=(SNGLSEG,RESPONSE,1),PRTY=(1,5),        X
            MODE=SNGL
  3. アプリケーションを設計する際は、メンテナンスとスケーラビリティを考慮したプログラムの構造やモジュールの設計が必要です。アプリケーションを設計するときは、次の点に注意してください。

    • DL/I関数の呼び出しを効果的に使用します。

    • データの入出力回数を最小限に抑えます。

    • データベースのデータ構造と処理オプション(検索、追加、削除)を考慮します。

    • 処理モード(会話モード処理と一般トランザクション・モード)の設定を考慮します。

    • メッセージのパスを考慮します。

1.2. プログラミング

COBOLでOSIアプリケーションを作成し、以下に注意してください。

  • プログラムの開始条件の設定

  • DB-PCB、IO-PCB、ALT-PCBの設定

  • 関数呼び出しインターフェースの設定

  • ステータス・コードのチェックとエラー処理の設定

  • データ処理時の整合性 (例:データ長)

  • プログラムの終了条件の設定 (例:リターン・コード)

  • 入出力データ・サイズまたはSSAサイズに関係なく、プログラミング時のデータ転送領域は十分に大きくなければなりません。

1.3. バッチ・アプリケーション

バッチ・アプリケーションは、OpenFrameのユーティリティであるtjesmgrによって実行されます。バッチ・アプリケーションの作成方法は、基本的にMPPアプリケーションと同じですが、JCLで実行されるという点が異なります。tjesmgrは、JCLを効果的に実行できるユーティリティです。

バッチ・アプリケーションはオンライン業務のためのプログラムではないため、端末との通信のためのデータ領域を定義する必要はありません。プログラムがデータベースに接続できるロジックとMQ(Message Queue)でメッセージをロードできるロジック、またはMQにデータが蓄積できるロジックのみ必要です。

2. MPPアプリケーション

IMS/DCオンライン環境でメッセージを処理するプログラムを、MPP(Message Processing Program)またはMPR(Message Processing Region)と呼びます。OSIでは、それらをシステム・サーバーとユーザー・サーバーに区別します。

以下の図は、オンライン環境でのOSIシステムとアプリケーションの構成を示しています。

figure 3 1
OSIシステムとアプリケーションの構成

通常、端末(LTERM)から入力されたトランザクションは、システム・サーバー(Control Region)によって分析され、そのトランザクションを処理するMPPアプリケーションは、OSIのユーザー・サーバーであるMPPユーザー・サーバーにロードされ実行されます。このトランザクションがOSIシステムに渡すデータ領域は、トランザクション・コード(最大8文字)とデータ領域で構成されます。システム・サーバーは、受け取ったトランザクション・コードを使用してRTSD(RunTime System Definition)表からクラス情報を取得し、クラスを処理するMPPユーザー・サーバーにスケジューリングします。

MPPアプリケーションはGet Unique(GU)呼び出しで端末から入力されたメッセージを取得できます。複数のユーザー・サーバーを起動して複数のMPPアプリケーションを処理することができ、データベースに同時接続することも可能です。LTERMだけでなく、トランザクション間にも、ALT-PCBを使用してMPPアプリケーションを開始できます。

2.1. MPPユーザー・サーバーの準備

MPPユーザー・サーバーの起動には、Tmax環境ファイルの設定、MPPサーバー起動用のJCLファイルの準備が必要です。OSIでは、Tmaxのtargetオプションを使用することで、OSIMPPSVRバイナリ・ファイル1つで、相互異なるクラス情報を処理する複数のMPPサーバーを起動することができます。

  • Tmax環境ファイルの設定

    OSIはTmax環境で動作するため、ユーザー・サーバーもTmaxサーバーに登録する必要があります。サーバーの登録方法は、Tmaxでサーバーを登録する一般的な方法と同じです。Tmaxサーバーを登録するときは、関連サービスも一緒に登録する必要があります。

    ################################################################################
    #   OpenFrame OSI Dependent Region Servers                                     #
    ################################################################################
    OSIMPPSVR       SVGNAME = svg_node1, MIN = 1, MAX = 10, RESTART = NO
    ################################################################################
    #   OSI, example in which IMSID is IMSA                                        #
    ################################################################################
    IMSASCHD        SVGNAME = svg_node1, MAX = 1, SVRTYPE = UCS, RESTART = NO,
                    TARGET = osisschd
    IMSACMMD        SVGNAME = svg_node1, MAX = 1, SVRTYPE = UCS, RESTART = NO,
                    TARGET = osicmdsv
    IMSAMPP_TCL1    SVGNAME = svg_node1, MIN = 1, MAX = 10, RESTART = NO,
                    TARGET = OSIMPPSVR
    IMSAMPP_TCL2    SVGNAME = svg_node1, MIN = 1, MAX = 10, RESTART = NO,
                    TARGET = OSIMPPSVR
    IMSAMPP_TCL3    SVGNAME = svg_node1, MIN = 1, MAX = 10, RESTART = NO,
                    TARGET = OSIMPPSVR
    IMSAMPP_TCL4    SVGNAME = svg_node1, MIN = 1, MAX = 10, RESTART = NO,
                    TARGET = OSIMPPSVR
    *SERVICE
    ################################################################################
    #   OSI USER APPLICATION SERVER DEFAULT                                        #
    ################################################################################
    OSIMPPSVRSVC       SVRNAME = OSIMPPSVR, SVCTIME=60
  • MPPサーバー起動用のJCLファイルの準備

    以下は、システム・サーバー(制御リージョン)名がIMSAの場合、管理者が作成したユーザー・サーバー(従属リージョン)に該当するMPPユーザー・サーバーを起動するJCLファイルです。クラスを指定しない場合は「000」で設定可能であり、最初のクラスの指定は必須です。(例で処理するクラスは、1、2、3、4です)

    //IMSAMSG  JOB
    //STEP1    EXEC PGM=DFSRRC00,
    //            PARM='MSG,001002003004,W00099000,,,R,,,,IMSA,,,,D2PA'
    //STEPLIB  DD DISP=SHR,DSN=OSI.IMSA.STEPLIB
    //SYSPRINT DD SYSOUT=*
    //SYSOUT   DD SYSOUT=*
    //SYSDBOUT DD SYSOUT=*
    //

2.2. MPPプログラミング

基本的なMPPプログラミングは、GUとISRT呼び出しで構成されます。

メッセージをGU処理する場合は、IO-PCBを使用してDL/I関数を呼び出します。メッセージが1つ以上のセグメントで構成されている場合は、2番目以降のセグメントは、GN呼び出しでメッセージを読み込む必要があります(SPAを使用するトランザクションの場合には、GUでSPAを読み込み、その後、GNでメッセージを読み込みます)。GUとGN呼び出しの結果は、IO-PCBのステータス・コード・フィールドに設定されます。MPPプログラムは呼び出し処理後に必ずステータス・コードをチェックする必要があります。メッセージ・セグメントを端末に送るか、他のトランザクションに送る場合は、データ領域にメッセージ・セグメントを指定のフォーマットに設定して、ISRT呼び出しでDL/I関数を呼び出します。

他のMPPプログラム、または他の端末に、メッセージを送ることができますが、メッセージを送信する際には、ALT-PCBを使用して宛先を指定する必要があります。

注意事項

以下は、MPPプログラミング時の注意事項です。

  • トランザクションが入力されるたびにスケジューリングされ、MPPが動的に空のユーザー・サーバーにロードされます。MPPの処理後、使用していたユーザー・サーバーは他のMPPプログラムに割り当てられるか、IDLE状態になるため、MPPユーザー・サーバー内に情報を保存することは不可能です。データの保存が必要な場合はSPAを使用します。

  • MPPの実行のためにOSIが行う事前処理が多いので、一度MPPがロードされると、多数のメッセージを処理するプログラムを作成します。しかし、メッセージの処理に多くの時間を費やしてしまうと、システムの定義時に指定した優先順位に従って均一化した、トランザクション・スケジューリングができなくなります。このような場合は、システム定義でTRANSACTマクロのPROCLIMの指定を活用します。

  • MPPでデータベースを更新する場合は、データベースに対する処理も行うため、注意が必要です。アプリケーションを必要以上に大きくしてデータベースのアクセスを独占しないように注意する必要があります。

  • 均等なスケジューリング・サービスを行うために、1つのトランザクション処理において多くの時間を要するMPPは作成せずに、複数のMPPに分割するようにプログラミングします。

  • MPPは処理中にステータス・コードをチェックし、問題がある場合はそれ以上処理しません。データベースの処理中にデータベースのバックアウトが必要な場合は、異常終了(ABEND)する必要があります。

  • OpenFrame環境設定のhidbサブジェクトのHIDB_DEFAULTセクションのUSE_DBD_DBMS_LOCKキーの値がYESに設定されている場合、トランザクションが開始される際、トランザクションが使用するDBD名でロックが生成され、トランザクションが終了されるときに解除されます。詳細については、『OpenFrame 環境設定ガイド』を参照してください。

2.3. メッセージ・セグメント・フォーマット

以下は、受信メッセージ・セグメント、送信メッセージ・セグメント、プログラム間のメッセージ・セグメントについての説明です。

2.3.1. 受信メッセージ・セグメント

ユーザー・プログラム(アプリケーション)では、端末や他のトランザクションからメッセージが渡されます。この際に、DL/I関数のGUおよびGN呼び出しを使用し、COBOLに定義したデータ領域に読み込んだデータを受信します。

一般的に、アプリケーションが受信したメッセージ・セグメントのフォーマットは、以下のとおりです。

LL ZZ DATA
機能 説明

LL

LLおよびZZフィールド長を含むメッセージ・セグメントの長さです。2バイトの2進数です。

PL/Iで作成されたアプリケーションの場合は4バイトであり、(実際の長さ-2)の長さで設定されます。

(LL = DATA長+4)

ZZ

データ・アクセスのための2バイトの領域です。このフィールドは開発者が設定する必要のないフィールドであり、任意で変更するとエラーが発生します。

DATA

端末から入力されたメッセージ・セグメントです。メッセージ・セグメントはトランザクション・コードとデータ領域で構成されます。端末に送信されたデータは、先頭の8バイトがトランザクション名になり、残りが実際のデータになります。

複数のメッセージ・セグメントで入力されるメッセージの場合は、最初のメッセージ・セグメントの先頭8バイト内にトランザクション・コードが含まれます。

2.3.2. 送信メッセージ・セグメント

アプリケーションから、端末や他のトランザクション、あるいは他の端末にメッセージを送る場合は、DL/I関数のISRT呼び出しを使用し、IO-PCB、またはALT-PCBに設定されている宛先にメッセージを送信します。

以下は、送信メッセージ・セグメントのフォーマットです。

LL ZZ DATA
フィールド 説明

LL

LLおよびZZフィールド長を含むメッセージ・セグメントの長さです。2バイトの2進数です。

PL/Iで作成されたアプリケーションの場合、LLは4バイトです。アプリケーションでは、このフィールドを設定する必要があります。(LL = DATA長 + 4)

Z1

データ・アクセスのための1バイトの領域です。アプリケーションでは、このフィールドに2進数で0を入力する必要があります。

Z2

1バイトで論理ページングを行うときに、新しいページの開始をMFSに通知する必要がある場合は、X'40’を入力します。それ以外の場合は、2進数で0を入力します。詳細については『OpenFrame OSI MFSリファレンスガイド』を参照してください。

DATA

特定の宛先(現在の端末、他のトランザクション、他の端末)に送信するデータ領域です。メッセージ・セグメントの長さは宛先によって異なります。メッセージは、複数のメッセージ・セグメントも問題ありません。

2.3.3. プログラム間のメッセージ・セグメント

特定のプログラムから他のプログラムにメッセージが送信できます。プログラム間でメッセージを送信する場合、上記の送信メッセージ・セグメントと同じ方法で送信します。

以下は、プログラム間で送信するメッセージ・セグメントのフォーマットです。

LL ZZ DATA
フィールド 説明

LL ZZ

送信メッセージ・セグメントのフォーマットと同じです。

DATA

ターゲット・プログラムにメッセージを送信します。

注意事項

以下は、プログラム間で送信されるメッセージ・セグメントを使用する場合の注意事項です。アプリケーションで使用するALT-PCBは、事前にPSBに定義されている必要があります。また、アプリケーションで使用するPCB(LINKAGE SECTIONおよびENTRY文)は、PSBに定義されたPCBと同じ順序で定義する必要があります。

  • アプリケーションAP1から他のアプリケーションAP2にメッセージを送信する場合はALT-PCBを使用し、ALT-PCBの宛先をAP2の名前として設定した後、CHNG、ISRT、PURGの順にDL/I関数を使用します。

  • AP2でメッセージを受信する場合は、IO-PCBを指定してメッセージを受信できます。正常にデータ(データ構造の整合性)を取得するには、IO-PCBにAP1のALT-PCBの内容が設定されている必要があります。

  • AP2で受信メッセージを処理した後、メッセージをAP1に再送信する場合はAP1のALT-PCBを指定します。この場合、AP1はAP2からメッセージを受信して処理します。メッセージを端末に出力する場合は、IO-PCBを指定してメッセージを送信します。AP2がメッセージを受信できるのは、MPPまたはBMPの場合です。

3. BMPアプリケーション

MPPとは異なり、ユーザーはデータベースにアクセスするだけでなく、データ管理を使用してOSIからユーザー・データセットにアクセスすることができます。データベースまたはメッセージを処理する方法は、MPPと同じです。MPPプログラミングとの違いは、MQにロードされているデータをリアルタイムで処理するのではなく、ユーザーが必要なときにJCLを介してBMPアプリケーションを起動し、処理することです。

たとえば、MPPアプリケーションによって処理された結果を、ALT-PCB(Alternative Program PCB)を使用してBMPアプリケーションに送信すると、OSIはその結果をMQ表にロードして待機し、ユーザーがJCLでそのBMPアプリケーションを実行すると、MQ表に蓄積されているすべてのメッセージを宛先のBMPアプリケーションに送信します。

以下は、BMPプログラムを起動するJCLの例です。

<OSIBMP.jcl>

//OSIBMPT JOB CLASS=A,MSGCLASS=X,MSGLEVEL=(1,1)
//TSTEP1 EXEC PGM=DFSRRC00,
// PARM=(BMP,OIVPIL04,,OIVPBMP4,,,,,,,,,,IMSA,)
//SYSOUT DD SYSOUT=*

以下は、上記のJCLを実行するtjesmgrユーティリティの実行例です。

$ tjesmgr run OSIBMP.jcl
> Command : [run OSIBMP.jcl]
Node name : NODE1
/home/oframe/OpenFrame/volume_default/SYS1.JCLLIB/OSIBMP.jcl is submitted as OSIBMPT(JOB00001).
$ tjesmgr ps
> Command : [ps]
JOBNAME JOBID CLASS STATUS RC NODE JCL
------------------------------------------------------------------------------
OSIBMPT JOB00001 A Done R00000 NODE1 OSIBMP.jcl