JP1/AJSの「排他スケジュール」機能には、同じ階層(同じ親を持つ兄弟関係)のジョブネットしか指定できないという絶対ルールがあるお話をしました。もし別階層のジョブネットを無理やり指定すると、エラーも出ずにスケジュールが真っ白(消滅)になってしまいます。
とはいえ、実務を運用していると、「別のジョブグループにあるこの処理とこの処理、サーバー負荷の都合上、どうしても同時に動かしたくない(排他をかけたい)!」という場面は多々ありますよね。
今回は、別階層のジョブネット同士で安全かつ確実に同時実行を禁止するための3つの「正規ルート(正しい設定方法)」をまとめました!
🛠️ ルート1:【推奨】「排他リソース」機能を使う(最も安全でスマート)
全システム、あるいは複数のジョブグループ間で共通の制限をかけたい場合に、最もおすすめなのが「排他リソース」を使ったジョブの排他制御機能です。
仕組みと設定方法
-
JP1内に「共通リソース名(例:
Server_Load_Limit)」のような仮想的な資源(排他リソース)を1つ定義します。 -
そのリソースの同時実行数を「1」に制限しておきます。
-
同時に動かしたくないジョブ(またはジョブネット)の双方に、この排他リソース名を設定します。
メリット
この方法の最大の強みは、「階層を一切意識しなくていい」という点です。どれだけ深い階層にバラバラに存在しているジョブネットであっても、同じ排他リソースが指定されていれば、JP1が自動的に「片方が終わるまで、もう片方を待機させる」という制御を行ってくれます。設定ミスによるスケジュールの消滅リスクもなく、非常に安全です。
JP1/AJSにおける「排他リソース」の詳細な設定手順を解説します。
排他リソースは、別階層のジョブネット同士であっても、定義した「仮想的な資源(リソース)」を奪い合わせることで、同時実行数を安全に制御(排他)できる非常に優れた機能です。
今回は、最も標準的な「JP1/AJS3 – View(GUI画面)」を使った設定手順をステップ・バイ・ステップで解説します。
🛠️ 排他リソースの設定手順(3ステップ)
設定は大きく分けて、「1. リソースの定義」➔「2. ジョブ(ネット)への割り当て」➔「3. 動作確認」の3つのステップで行います。
ここでは例として、同時に1つしか動かしたくない(同時実行数:1)排他制御を設定します。
ステップ1:排他リソース定義の作成
まず、システム全体、または特定の階層で使い回す「共通の枠組み(リソース)」を作ります。
-
JP1/AJS3 – View を起動し、[詳細定義] 画面を開きます。
-
排他リソースを作成したいジョブグループ(または最上位のマネージャー)を選択します。
-
メニューの [編集] ➔ [排他リソース定義の新設] を選択します。
-
開いたダイアログで以下の項目を設定します。
-
排他リソース名: 任意の名前を入力(例:
Server_Load_Limit) -
総リソース数:
1と入力(※同時に1つしか動かさないため)
-
-
[OK] をクリックして保存します。
ステップ2:ジョブネット(またはジョブ)への割り当て
次に、同時にバッティングさせたくない「別階層にある2つ以上のジョブネット(またはジョブ)」のそれぞれに、先ほど作ったリソースを紐付けます。
-
同時に動かしたくない 1つ目のジョブネット を右クリックし、[詳細定義] を開きます。
-
画面内にある [排他リソース] タブ(または項目)を選択します。
-
以下の項目を設定します。
-
使用リソース名: ステップ1で作った排他リソース名(例:
Server_Load_Limit)を選択、または入力します。 -
使用リソース数:
1を指定します。 -
排他エラー時の動作:
順次実行(待合せ)を選択します。(※相手が終わるのを待たせる設定です)
-
-
[OK] をクリックして閉じます。
-
同時に動かしたくない 2つ目(以降)のジョブネット に対しても、全く同じ設定を繰り返します。
ステップ3:スケジュール登録と動作確認
設定が完了したら、正しく排他制御がかかるか確認します。
-
対象のジョブネットを [確定登録] または [計画登録] します。
-
あえて2つのジョブネットの実行予定時刻が「完全に重複する時間帯」になるようにスケジュール(または手動キック)します。
-
[ジョブ運用状況の監視] 画面で挙動を確認します。
-
先に起動した片方のジョブネットが 「実行中」 になります。
-
後から起動したもう片方のジョブネットが 「排他待ち」(または保留・実行待ち)ステータスになり、自動で停止することを確認します。
-
先のジョブネットが「終了」した瞬間に、待たされていたジョブネットが自動的に「実行中」へ遷移すれば大成功です。
-
💡 実務で役立つ設定のポイント
-
ジョブネット単位か、ジョブ単位か: 排他リソースは「ジョブネット」にも「個々のジョブ」にも設定できます。処理のかたまりごと制限したい場合はジョブネットに、特定の重いバッチコマンド単体だけを制限したい場合はジョブに設定するのがセオリーです。
-
総リソース数を変えれば「同時実行数の制限」になる: 今回は同時実行数を「1(完全排他)」にしましたが、例えば総リソース数を「3」にして、各ジョブの使用リソース数を「1」にすれば、「どれだけ同時に起動リクエストが来ても、最大3つまでしか同時並行させない(4つ目は待たせる)」という負荷分散コントロール(スロットリング)も可能です。
🔗 ルート2:「ジョブネットコネクタ」を使う(明示的な前後関係がある場合)
「同時に動かしたくない」というよりは、「別階層にあるAの処理が完全に終わってから、Bの処理を動かしたい」という明確な順序(前後関係)がある場合は、ジョブネットコネクタの出番です。
仕組みと設定方法
-
待ち受ける側のジョブグループに「ジョブネットコネクタ」を配置し、接続先として別階層にある先行ジョブネットを指定します。
-
先行ジョブネットの実行終了を検知して、後続のジョブネットが安全にキックされます。
メリット
ジョブの実行順序が「見える化」されるため、運用の流れをパッと見で把握しやすくなります。ただし、あくまで「順番に動かす」ための機能なので、「どちらが先に動くか分からないが、とにかくバッティングだけは防ぎたい」という純粋な排他制御にはルート1のほうが向いています。
⏳ ルート3:「待合せ条件」を使う(イベント基準で制御する場合)
JP1/AJS3から強化された「待合せ条件」機能を利用するのも一つの手です。
仕組みと設定方法
-
特定のジョブネットの「開始条件」や「状態」を、別階層のジョブネットから見に行けるように設定(待ち合わせ)します。
-
「相手が『未実行』または『終了』の状態であること」を条件にすることで、同時に実行状態になるのを防ぎます。
メリット
より複雑な条件(特定の時間帯だけ待つ、特定のエラー時だけ回避するなど)をシチュエーションに応じて柔軟に組み込めるメリットがあります。
💡 結論:迷ったら「排他リソース」を設定するのがベスト!
別階層の排他制御で迷ったら、まずは「ルート1:排他リソース(同時実行数:1)」を設定するのが一番の近道であり、ベストプラクティスです。
-
排他スケジュール機能: 同じ階層の兄弟同士の時だけ使う
-
排他リソース機能: 階層が違う、またはシステム全体でコントロールしたい時に使う
この2つの使い分けをマスターしておけば、「スケジュールが消えた!」というトラブルに怯えることなく、安全で高効率なジョブ運用スケジュールを組むことができますよ。ぜひ設計の参考にしてみてくださいね!
