アプリケーションの作成
本章では、アプリケーション・プログラムを作成する方法について説明します。
1. アプリケーションの作成手順
アプリケーションを作成する手順は、アプリケーションの設計、プログラミング、デバッグ、実行に分けられます。
各ステップには、OSIで定義する必要があるリソースと、ユーザーが任意で作成するプログラミングが含まれます。
1.1. アプリケーションの設計
アプリケーションの設計は、以下の手順で行われます。
-
開発者は、アプリケーションが実行されるユーザー・サーバーのタイプを決定する必要があります。
アプリケーションを処理するユーザー・サーバーには、MPPユーザー・サーバーとBMPユーザー・サーバーがあります。この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
-
アプリケーションを設計する際は、メンテナンスとスケーラビリティを考慮したプログラムの構造やモジュールの設計が必要です。アプリケーションを設計するときは、次の点に注意してください。
-
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システムとアプリケーションの構成を示しています。
通常、端末(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