GSAM および IMS メッセージ・キュー・アクセス

GSAM および IMS™ メッセージ・キューは、EGL を介してアクセスされるシリアル・ファイルの 2 つの例です。

シリアル・ファイルは、EGL で扱える最も古いタイプのファイルですが、用途の広いファイル・タイプです。 シリアル・ファイルへのアクセスは、一度に 1 レコードずつ順に行います。EGL では、シリアル・ファイルを実装するために 3 つの方法があります。
VSAM
仮想記憶アクセス方式。詳しくは、VSAM ファイルへのアクセスを参照してください。
GSAM
汎用順次アクセス方式 (Generalized Sequential Access Method)。IMS または z/OS バッチ環境では、 このアクセス方式を使用してバッチ処理を行います。
IMS メッセージ・キュー
WebSphere® MQ (以前の MQSeries®) メッセージ・キューと混同することのないようにしてください。

シリアル・レコード (SerialRecord ステレオタイプを持つレコード定義) は、 生成時に ResourceAssociation パーツを使用して特定のファイルに関連付けます。 このプロセスにより、EGL がレコードを使用して VSAM、 GSAM、または IMS メッセージ・キューのいずれのアクセスをするかが決まります。詳しくは、「EGL 生成ガイド」を参照してください。

GSAM ファイルとしてのシリアル・ファイル

IMS BMP または z/OS バッチ環境で実行される EGL プログラムは、 シリアル・ファイルを GSAM (汎用順次アクセス方式) ファイルとして実装することができます。これにより、 これらのシステムでごく基本的なデータベース機能セットが提供されます。GSAM ファイルとして実装するシリアル・ファイルには、addget next、および close I/O ステートメントを使用できます。

GSAM のシリアル・ファイルの処理には、以下の特性が適用されます。
  • GSAM ファイルは、データベース・ドライバー (DBD) を必要とします。
  • GSAM ファイルは、IMS PSB に PCB を必要とします。この PCB は、IMS ランタイム PSB、および EGL PSB 定義で定義する必要があります。プログラムでは、PSB レコード・パーツに基づくレコード変数を宣言する必要があります。
  • GSAM ファイルは DL/I 呼び出しにより読み取り/書き込みがされます。生成された COBOL プログラムは、要求された I/O ステートメントに基づいてこれを自動的に処理します。
  • GSAM ファイルは、DL/I データベースと同じ方法で、チェックポイント指定され、再開されます。 ただし、GSAM ファイルをリカバリーするには、 基本チェックポイントに代えて、シンボリック・チェックポイントを使用し、再開する必要があります。
EGL では、 GSAM または未定義の長さのレコードについては、レコード検索引数をサポートしていません。

IMS メッセージ・キューとしてのシリアル・ファイル

IMS/VS で実行されるプログラムは、シリアル・ファイルを IMS メッセージ・キューとして実装します。 IMS BMP プログラムとして実行されるプログラムも、シリアル・ファイルをメッセージ・キューとして実装できます。 出力ファイルには、add ステートメントと get next I/O ステートメントのほか、close も使用できます。 IMS/VS または IMS BMP をターゲットのランタイム環境として選択した場合、 シリアル・ファイルまたは印刷ファイルをメッセージ・キューに関連付けて定義することができます。IMS/VS の場合は、すべてのシリアル・ファイルと印刷ファイルをメッセージ・キューに関連付ける必要があります。メッセージ・キューに関連付けることができる入力ファイルは 1 つのみです。

シリアル・レコードをメッセージ・キューに関連付ける際には、プログラム・データのみ定義します。 生成された COBOL プログラムでは、add ステートメントについて IMS メッセージ・ヘッダー (長さ、ZZ、 およびトランザクション・コード) を追加し、get next ステートメントについてはこれを除去します。

シリアル・ファイルの I/O ステートメントの結果の確認

シリアル・ファイルをメッセージ・キューまたは GSAM ファイルに関連付けると、 生成されたプログラムは DL/I 呼び出しを発行して、入出力操作を実装します。DL/I 呼び出しが完了すると、Rational® COBOL Runtime は以下の機能を実行します。
  • get next ステートメントの場合、レコードの状態は DL/I 状況コードに基づいて設定されます。生成されたプログラムが入出力 PCB に対して GU 呼び出しを発行すると、sysVar.sessionID および sysVar.userID フィールドが、入出力 PCB のユーザー ID フィールドを基に更新されます。この処理は、次の場所で行われます。
    • 複数セグメントのメッセージ・キュー (MMSGQ) として定義されているシリアル・ファイルに対する最初の get 文。
    • 単一セグメントのメッセージ・キュー (SMSGQ) に対して get next ステートメントが発行されるたび。
    EGL の sysVar.transactionID フィールドは、get next ステートメントが発行され、入出力 PCB に対して GU 呼び出しが行われるたびに、IMS メッセージ・ヘッダー内のトランザクション名に基づいて更新されます。
  • add ステートメントまたは close ステートメントについては、 DL/I 状況コードに基づきレコードの状態が更新されます。

メッセージ・キューまたは GSAM に関連する DL/I 呼び出しの後に、dliVar フィールドは更新されません。 これらのフィールドは、DL/I セグメント・レコードにアクセスする関数の場合にのみ更新されます。これにより、CICS® 一時データ・キューまたは OS/VS シリアル・ファイル用に作成されたプログラムは、そのファイルが IMS 環境のメッセージ・キューまたは GSAM データベースに変更されても、整合性を維持したまま実行できます。 シリアル・ファイルで endOfFile、noRecordFound、またはその他のエラーが発生したかどうかを判別するには、 I/O エラー値をチェックします。PCB からさらに詳細な情報を必要とする場合は、IO_PCBRecord または ALT_PCBRecord のフィールド名を使用します。

PSB 変数 (名前は myPSB) が ALT_PCBRecord (名前は myAltPCB) を宣言して、リソース関連で myAltPCB を PCB 名として使用した状況を考えてみます。add ステートメントの後で DL/I 状況コードを参照するには、myPSB.myAltPCB.statusCode を使用します。

EGL I/O エラー・コード IMS メッセージ・キューの状況コード 重大度
endOfFile QC ソフト
noRecordFound QD ソフト
ioError 非ブランクの任意の状況コード ハードまたはソフト
hardIOError QC、QD、CE、CF、CG、CI、CJ、CK、CL 以外の非ブランクの状況コード ハード
EGL I/O エラー・コード GSAM 状況コード 重大度
endOfFile GB ソフト
ioError 非ブランクの任意の状況コード ハードまたはソフト
hardIOError GB 以外の非ブランクの状況コード ハード

フィードバック