COBOLジョブネット設計の基本!依存関係管理と運用のポイントを初心者向けに解説
生徒
「COBOLのバッチ処理で、プログラムを順番に動かす仕組みを『ジョブネット』と呼ぶそうですが、どうやって設計すればいいんですか?」
先生
「ジョブネットは、いわばプログラムの『実行計画図』です。どのプログラムをどの順番で動かすか、その繋がり(依存関係)を正しく管理することが重要ですよ。」
生徒
「もし順番を間違えたら、データがめちゃくちゃになっちゃいますよね。初心者が気をつけるべきポイントを教えてください!」
先生
「その通り。依存関係が崩れると大きなトラブルになります。では、ジョブネット設計のコツを基本から丁寧に解説しましょう!」
1. ジョブネットとは?プログラムの「流れ図」を理解しよう
ジョブネットとは、コンピュータが行う一つ一つの仕事(ジョブ)を網(ネット)のように繋ぎ合わせたものです。プログラミングやパソコンに詳しくない方には、「料理のレシピ」や「工場の工程表」をイメージしてもらうと分かりやすいでしょう。
例えば、カレーを作る工程を考えてみてください。
- 工程1:野菜を切る
- 工程2:肉と野菜を炒める
- 工程3:水を加えて煮込む
- 工程4:ルーを入れて完成させる
2. 依存関係管理の重要性!なぜ順番を守る必要があるのか
なぜこれほどまでに順番が厳しく言われるのでしょうか。それは、バッチ処理が「前のプログラムが作ったデータを使って、次のプログラムが動く」というバトンリレー形式だからです。もしバトンを渡す前に走り出してしまうと、プログラムは「読み込むデータがない!」と言ってエラーで止まってしまいます。
さらに怖いのは、エラーにならずに間違った結果を出してしまうこと(論理エラー)です。前日の売上データを計算する前に、一ヶ月の合計を出す処理が動いてしまったら、最新の売上が含まれない間違った集計表ができてしまいます。これを防ぐために、ジョブネット設計では「何が完了したら次を動かすか」という条件を明確にする必要があるのです。
* 前の処理が作ったファイルを読み込むシンプルな例
IDENTIFICATION DIVISION.
PROGRAM-ID. STEP-2-PROCESS.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT SALES-FILE ASSIGN TO "SALES.DAT".
PROCEDURE DIVISION.
* ここでファイルを開くとき、前の工程がファイルを閉じていないとエラーになる
OPEN INPUT SALES-FILE.
DISPLAY "前工程のデータを正常に受け取りました。".
CLOSE SALES-FILE.
STOP RUN.
3. 先行ジョブと後続ジョブの設計ポイント
ジョブネットの中では、先に動くものを先行ジョブ、その後に動くものを後続ジョブと呼びます。設計のポイントは、これらを「一筆書き」のように繋ぐだけでなく、途中で枝分かれ(並列処理)や合流をうまく使うことです。
例えば、Aというデータを処理している間に、全く関係のないBというデータを処理することは可能です。これを同時に行うことで、全体の処理時間を短くすることができます。しかし、最後にAとBの両方のデータを使ってCという集計表を作るなら、CはAとBの両方が終わるまで待っていなければなりません。このように「待ち合わせ」の条件を正しく設定することが、設計者の腕の見せ所です。
* 自分の処理が終わったことを画面に表示して知らせる
IDENTIFICATION DIVISION.
PROGRAM-ID. STEP-FINISHED.
PROCEDURE DIVISION.
* 実際にはここでリターンコード(終了コード)をシステムに返す
DISPLAY "ステップAの処理が正常に完了しました。".
DISPLAY "後続のステップBへバトンタッチします。".
STOP RUN.
4. 異常終了(アベンド)時のリカバリを考慮する
ジョブネットを設計する際、忘れてはいけないのが「失敗したときのこと」です。プログラムが途中で止まってしまった場合、その後のジョブをどうするかを決めておかなければなりません。これをリカバリ設計と言います。
一般的には、エラーが起きたらその後のジョブはすべて「抑止(よくし)」、つまり動かないように設定します。もし、エラーを無視して次のジョブが動いてしまうと、壊れたデータを使ってさらに被害が広がってしまうからです。設計時には「もしここで止まったら、どこまでデータを戻して、どのジョブからやり直すべきか」という手順書を一緒に作成することが、プロの仕事と言えるでしょう。
5. 条件分岐のあるジョブネット!状況に応じて動きを変える
常に同じ順番で動くだけがジョブネットではありません。プログラムの中で出した「判定結果」によって、次に動くジョブを切り替えることができます。これを条件分岐(じょうけんぶんき)と言います。
例えば、今日の取引データが1件もなかった場合は、集計プログラムを動かしても意味がないので、そのまま終了処理へジャンプする、といった動きです。COBOLプログラムからは「終了コード」という数字を出すことができ、スケジューラはこの数字を見て「次は右の道か、左の道か」を判断します。
* 条件によって終了コードを変える例
* 0なら成功、4なら警告(データなし)、12なら致命的エラー
IF DATA-COUNT = 0 THEN
MOVE 4 TO RETURN-CODE
DISPLAY "処理対象データがありません。"
STOP RUN
ELSE
MOVE 0 TO RETURN-CODE
DISPLAY "処理成功。"
STOP RUN
END-IF.
6. ジョブネットの「可視化」とドキュメント管理
設計したジョブネットは、専用のツール(JP1やControl-Mなど)で登録しますが、それとは別に誰でも見られる図解ドキュメントを残すことが極めて重要です。なぜなら、トラブルが起きたときに真っ先に確認するのがこの図だからです。
複雑なシステムでは、ジョブネットが何枚ものシートに分かれるほど巨大になります。初心者の方が現場に入ったときは、まずこの全体図を眺めて、「このデータはここから来て、ここで計算されて、最後にあそこへ行くんだな」というデータの流れを掴むようにしましょう。図が綺麗に整理されているジョブネットは、保守もしやすく、ミスも起きにくい優れた設計と言えます。
7. ファイルの「世代」とジョブネットの密接な関係
バッチ処理でよく使われるのが、ファイルの世代管理(せだいかんり)です。昨日のファイル、今日のファイル、明日のファイルというように名前を変えて保存しておきます。ジョブネット設計では、どの世代のファイルを読み込み、どの世代として書き出すかを正確に指示しなければなりません。
例えば、「前日までの累計ファイル」を読み込んで、「今日の売上」を足して、「最新の累計ファイル」を作る場合、世代の指定を一つ間違えるだけで、過去のデータが消えてしまったり、二重に計算されてしまったりします。ジョブネットの中で、ファイルという資源(リソース)がどのように受け渡されているかを意識することが、設計の基本です。
8. 並行処理の活用!実行時間を短縮するテクニック
大規模なシステムでは、バッチ処理を決められた時間内(オンラインサービスが始まる朝までなど)に終わらせる必要があります。これをバッチ突き抜け(予定時間をオーバーすること)といいます。これを防ぐための強力な武器が「並行処理」です。
依存関係がない処理同士を同時に動かすことで、1時間かかる処理を30分に短縮できるかもしれません。ただし、何でもかんでも同時に動かせばいいわけではありません。コンピュータのメモリやCPUといった「体力」には限界があるからです。ジョブネット設計者は、マシンのパワーと相談しながら、最適な並列度を決めていきます。
* 並行して動いても良いように、ファイルを分けて出力する例
* A支店の処理
SELECT BRANCH-A-FILE ASSIGN TO "BRANCH_A.DAT".
* B支店の処理
SELECT BRANCH-B-FILE ASSIGN TO "BRANCH_B.DAT".
* これなら別々のプログラムで同時に書き込んでもぶつからない
9. 運用監視とジョブネットの最適化
ジョブネットは一度作ったら終わりではありません。日々動かしていく中で、「このジョブはいつも時間がかかるな」「ここの待ち時間は無駄だな」という課題が見えてきます。これを見守ることを運用監視(うんようかんし)といいます。
監視の結果を元に、ジョブネットの繋がりを整理し直したり、プログラムを改良したりして、より安定した速いシステムへと育てていきます。初心者の皆さんは、まず「正しく動く」設計を目指し、慣れてきたら「効率よく動く」設計を考えてみてください。ジョブネットを使いこなせるようになれば、あなたはもう立派なシステム運用管理のプロフェッショナルです!