JS7® JobSchedulerクイックスタート

JS7®JobSchedulerは独SOS社(Software- und Organisations-Service GmbH)によって開発されている、ジョブ管理システムです。
OSSジョブ管理ツールの定番JobSchedulerをリニューアルし、従来より耐障害性、大規模環境対応を強化し、ミッションクリティカルな要求に対応しています。
本記事では、JS7®JobSchedulerで初めてジョブを実行する方法までを記載しています。
参考：

https://kb.sos-berlin.com/display/PKB/JS7+-+Getting+Started

詳細な情報については、以下をご覧下さい。

- ナレッジベース（英語）　https://kb.sos-berlin.com/display/PKB/JS7
- 日本語紹介資料 https://www.ossl.co.jp/
- フォーラム　https://groups.google.com/forum/?hl=ja#!forum/jobscheduler-ja
- Facebook https://www.facebook.com/Jobscheduler-Japan-%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%82%B0%E3%83%AB%E3%83%BC%E3%83%97-594469610565511/timeline/
- 日本JobSchedulerユーザーグループ https://sites.google.com/site/jobschedulerja/
- JIRA（英語） 　https://change.sos-berlin.com/secure/Dashboard.jspa
- User Forum（英語）　http://sourceforge.net/projects/jobscheduler/forums/forum/486122
- SOS社ホームページ　http://www.sos-berlin.com


# 1. 前提条件

JS7® JobScheduler V.2.1以上がインストール済みであること
JS7® JobSchedulerの概要及びインストール方法については以下を参照ください
**Dockerでのインストール手順**　https://qiita.com/satoruf/items/360fee5293611433ed33
**Windowsでのインストール手順**　https://qiita.com/Yoshitami/items/6804584592956a483364
**Linux/CLIでのインストール手順**　https://qiita.com/satoruf/items/fa9846f4376d1a50a67e

# 2. はじめに

## (1) デフォルトジョブリソースのインストール

デフォルトジョブリソースとは、定義済み共通ジョブリソース（JS7®インスタンス内でのグローバル変数）です。
ホスト名やエージェント名、ワークフロー名などをジョブ内から呼び出すことができます。
*ジョブリソース :*

https://kb.sos-berlin.com/display/PKB/JS7+-+Job+Resources

画面右上のヘルプメニュー（？マーク）をクリックし、サンプル＞デフォルトジョブリソースを選択
メニューからサンプルダウンロードをクリック
![スクリーンショット 2021-11-18 16.19.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52445/659b2bb7-3e22-53c0-bc74-5062c05767ec.png)

ジョブ定義メニューをクリックし、画面右上のインポートボタンをクリック
![スクリーンショット 2021-11-18 16.24.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52445/0ca527b2-dc91-5cb4-621f-980acde51d34.png)

ジョブ定義画面のインベントリーを選択し、左側のコントローラーを展開、ジョブリソースからDefaultをクリック
![スクリーンショット 2021-11-18 16.26.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52445/ed0865e4-1737-dd7d-1bf4-481f6c1646ae.png)

このままでは、未配置状態で使用できないので、配置ボタンをクリック
![スクリーンショット 2021-11-18 16.27.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52445/7724e41c-aad5-2f26-1d91-9a8a32c3f85e.png)

登録をクリックして、配置済みになることを確認
![スクリーンショット 2021-11-18 16.28.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52445/02e83fc8-0675-46c0-f82c-110b8d3fd40e.png)

JobSchedulerからのメール送受信を設定する場合、eMailDefaultをクリックして、有効なアカウント/パスワード、smtpホストなどを入力し、配置をクリック
![スクリーンショット 2021-11-18 16.44.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52445/a594de9e-c324-dfe4-b25b-4c2f2cd627c7.png)

## (2) ワークフローサンプルのインストール

SOS社サイトのオンラインデモでは様々なワークフローサンプルが用意されていますので、下記サイトからお試しできます。

https://www.sos-berlin.com/en/try-out

各ワークフローサンプルの説明は以下をご参照ください

https://kb.sos-berlin.com/display/PKB/JS7+-+Online+Demo

オンラインデモと同じワークフローサンプルをインストールします
画面右上のヘルプメニュー（？マーク）をクリックし、サンプルからジョブ実行環境に応じてUnix版かWindows版のワークフローサンプルを選択してダウンロード、
![スクリーンショット 2021-11-19 16.05.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52445/2065c251-ffe5-3055-f5f0-d61cd5f965db.png)

ジョブ定義メニューをクリックし、画面右上のインポートボタンをクリックし、ダウンロードしたExamples.tar.gz|.zipを選択
![スクリーンショット 2021-11-19 16.09.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52445/7a9a71c0-4a78-9d24-c853-eabaf2dcd884.png)

ジョブ定義画面のインベントリーを選択し、左側のコントローラーから展開、ワークフローをクリックすると、該当ワークフロー編集画面になります
![スクリーンショット 2021-11-19 16.12.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52445/19fc617f-be24-dd76-1f12-11b7dda56aed.png)

# 3. サンプルワークフローの実行

## (1) エージェント名の変更

サンプルワークフロージョブはすべて実行エージェント名が"primaryAgent"で登録されておりそのままでは配置・実行できません（ワークフローが「無効」になっている）ので、使用する登録済みのエージェント名（本記事では"js7-agent-primary"）に変更するか、エイリアス名を設定します。
エイリアス名とは、開発環境と本番環境でエージェント名が異なっても、ジョブ定義では共通のエイリアス名を使用するとワークフロージョブの定義内容を変える必要がありません。
ここではワークフロー内に多数のジョブ定義のエージェント名を一括で変更します。
変更元の"primaryAgent"が登録されていないと一括変更できませんので、最初に変更元の"primaryAgent"を管理メニューから登録
![スクリーンショット 2021-11-24 17.36.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52445/16df0a79-6fe5-d9a1-b467-fbc2d599419d.png)
![スクリーンショット 2021-11-24 17.37.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52445/b0c8e157-e384-d075-8bcb-44b6c00a3dd5.png)

URLは登録済みのエージェントと異なるポートを適当に入れます。
![スクリーンショット 2021-11-24 17.38.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52445/4250eb3a-9e5f-79de-c8d2-e62cd331da6c.png)

ジョブ定義画面のインベントリーから、変更するワークフロー（ここでは"/Examples.Unix/01_HelloWorld/jduHelloWorld"）を選択し、ジョブ"job-hello-world"をクリックすると、エージェントが"primaryAgent"で登録されていることが確認できます。
![スクリーンショット 2021-11-24 17.43.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52445/3a5ecf1a-a18b-d3f7-3900-330f1449655a.png)

変更するワークフローをジョブ定義画面の左側のインベントリーから選択、右側のプロパティペインの右上にある検索・置換ボタンをクリックすると、ワークフローのエージェント検索・置換ダイアログボックスが表示されますので、変換元エージェントを検索ボックス、変換先を置換ボックスで選択して、登録します。
![スクリーンショット 2021-11-24 17.50.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52445/87ffdc60-9392-b234-4b15-27675b295e23.png)

## (2) ワークフローの実行

有効なエージェントが登録されると、ワークフローが有効に変わるので、配置ボタンをクリックし登録すると、未配置から配置済に変わります。
![スクリーンショット 2021-11-24 17.52.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52445/7e34e381-de69-b8c4-0e8b-19a1a6ef51b3.png)

ワークフローが配置済みになると、ワークフロー画面に配置済みワークフローが表示されます。
![スクリーンショット 2021-11-24 17.54.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52445/de7fa9e0-5143-8e40-a242-b1e5cb471d0b.png)

ワークフローを実行するには、アクションメニューからオーダー追加を選択
![スクリーンショット 2021-11-24 17.57.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52445/806cf5dc-fc3a-1840-e7a8-67f9dd166191.png)
オーダー名は入力しないでも自動採番されますので、即時実行する場合は開始時間現在のまま登録
![スクリーンショット 2021-11-24 17.58.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52445/df23a56d-c375-10bf-24ad-e92819843558.png)
実行結果が下部のオーダー履歴に表示されます
![スクリーンショット 2021-11-25 18.35.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52445/33258c54-0a4a-0337-035a-05d1fd8194ea.png)
オーダーIDをクリックすると、実行オーダーのログが表示されます
![スクリーンショット 2021-11-25 18.37.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52445/4c2aeb6f-c56c-5de3-05b4-6848d202b0c4.png)

## (3) ワークフローの定期実行

https://kb.sos-berlin.com/display/PKB/JS7+-+Daily+Plan+Service

ワークフローを定期的に実行するには、実行計画を作成します。
JS7®ではJOCコックピットがバックグラウンドで日次実行する「デイリープランサービス」によって、スケジュールで定義したオーダーが作成され、コントローラーに配布します。
デイリープランサービスは、実行計画で定義した「スケジュール」を実行し、指定された開始時刻のオーダーを生成します。
オーダーの開始時刻を1つだけ指定するスケジュール（シングルスタート）と、周期的な開始時刻を指定するスケジュール（繰り返し実行）に適用されます。サイクル内の各開始時刻に対して、個々のオーダーが作成され、コントローラーに配布されます。
スケジュールの実行及びオーダーの生成は、デイリープランサービスによって設定した下記の内容で自動的に実行されます。
設定>dailyplan画面で
+ time_zone： 実行計画実行時間のタイムゾーン、例　Asia/Tokyo
+ period_begin：　作成する実行計画の開始時間、開始時間から24時間分作成される、通常0時
+ start_time: デイリープランサービス実行時間、デフォルト　period_beginの30分前
+ days_ahead_plan： オーダーを作成する日数
+ days_ahead_submit： コントローラーにオーダーを登録する日数
を設定できます

#### 1. カレンダーの作成

https://kb.sos-berlin.com/display/PKB/JS7+-+Calendars

スケジュールを作成するために、まずカレンダーを作成します。
カレンダーは、オーダー、ジョブ、スケジュールを実行する予定の日のリストです。
カレンダーは、稼働日または非稼働日のいずれかとして定義でき、組み合わせや再利用が可能です。
カレンダーの組み合わせの例としては、月曜から金曜までの5日間を通常の稼働日とするカレンダーと、その年の祝祭日を指定するカレンダーを組み合わせて使用することができます。
再利用とは、例えば、稼働日カレンダーを一度定義して、拠点毎に休業日など必要に応じて非稼働日を指定することをいいます。

ジョブ定義画面の左側ペインから、実行計画＞カレンダーを選択し、右上の新規カレンダーボタンをクリックします
![スクリーンショット 2021-11-26 14.53.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52445/f01abacb-9780-7c28-e30c-6efb833a3acb.png)
任意のカレンダー名を入力し、登録をクリック
![スクリーンショット 2021-11-26 14.55.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52445/df37479d-660e-dcdd-9ef0-9f513b914680.png)

カレンダー一覧に登録したものが表示されるので、カレンダー名をクリックし、タイトルなどを入力して、右下の周期追加ボタンをクリック
![スクリーンショット 2021-11-26 14.57.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52445/765ea2a5-d6f9-1882-265f-d5eab7f29910.png)
周期タイプを平日にして、月曜〜金曜をチェックして周期追加ボタンをクリック
![スクリーンショット 2021-11-26 14.59.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52445/e9addd08-a7e1-183b-1157-b56c29712e62.png)
これで平日カレンダーが登録できましたが、リリースしないと使用できないので、右上のリリースポタンをクリックすると未リリースからリリース済みに変わります
![スクリーンショット 2021-11-26 15.01.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52445/8994e8d9-4bc6-b5a1-1603-b042d7cf13e8.png)

同様に休業日タイプの休日カレンダーを作成します。周期追加で周期タイプを国民の祝日で選択、全てにチェックを入れて周期追加します。
![スクリーンショット 2021-11-26 15.06.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52445/c9c045a9-0799-435a-4be8-14ace3a043d5.png)
登録できたらリリースします
![スクリーンショット 2021-11-26 15.07.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52445/30389a10-77b3-b1f2-dd02-f3be8e1c6b20.png)

#### 2. スケジュールの作成
https://kb.sos-berlin.com/display/PKB/JS7+-+Schedules

次にジョブ定義画面でスケジュールを作成するワークフローを選択し、実行計画からスケジュールを選択、新規スケジュール作成をクリックします。
![スクリーンショット 2021-11-26 15.08.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52445/57d0af95-79ea-d5e2-a4b0-9432e2d219bb.png)
作成したスケジュール名を一覧から選択し、適用するワークフロー名を選択します。
![スクリーンショット 2021-11-26 15.13.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52445/4a443b8a-f62c-b94a-1908-bf17b5e3ea77.png)
+ チェックボックス「オーダー自動登録」は、デイリープランサービスによって自動的にスケジュールを適用することを指定します。作成されたオーダーは、予定状態で追加されます。（コントローラーに自動登録されません）
+ チェックボックス「計画時にコントローラーにオーダー登録」は、現在の実行計画の実行時またはデイリープランサービスによって自動的にオーダーがコントローラーに送信され、オーダーが登録状態となります。

**ランタイム設定**
右上のランタイムボタンをクリックし、まずカレンダーを指定します
![スクリーンショット 2021-11-26 15.19.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52445/bc6da58c-fab4-7038-bb66-c87e6deaba9c.png)
登録したカレンダーの右側の開始時間のプラスボタンをクリックすると、開始時刻の設定ができます
![スクリーンショット 2021-11-26 15.20.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52445/b063176f-ca36-4fe3-61c5-359a8868f647.png)
指定した稼働日が休日だった場合、実行する、実行しない、翌稼働日または前稼働日に実行することも指定できます。
一番右側の制限のプラスボタンでは、さらに特定の曜日や日・週・月ごと、月初・月末から指定日数のみなど様々な実行タイミングを指定することができます。
ランタイムを設定後リリースボタンをクリックすると、スケジュールがリリース済みになります

**実行計画の作成**
実行計画画面の実行計画作成ボタンをクリックするとスケジュールが登録されます。
![スクリーンショット 2021-11-26 16.13.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52445/6823fe57-de7d-ee13-910b-06167e997741.png)

**一部のジョブだけ特定の日時に実行する（しない）方法**

特定の日にワークフロー中の一部のジョブだけ実行したい（したくない）場合などには、許可時間設定を使用できます。許可時間とは、ジョブごとに設定するジョブ実行可能な時間で、ジョブオプションで曜日、開始時間、実行時間帯を指定できます。

https://kb.sos-berlin.com/display/PKB/JS7+-+Admission+Times+for+Jobs

*指定したジョブを実行しないでワークフロー実行を停止*
ジョブオプションで「許可時間ではないときスキップ」をチェックせずに、定義されているスケジュールの実行日（例：月曜〜金曜）に含まれる曜日（金曜）を許可時間設定で指定すると、許可した金曜日以外はオーダーが停止し次の許可時間になるまで次のジョブは実行されません。

*指定したジョブをスキップしてワークフロー実行を継続*
ジョブオプションで「許可時間ではないときスキップ」をチェックし、定義されているスケジュールの実行日（例：月曜〜金曜）に含まれる曜日（金曜）を許可時間設定で指定、そのジョブは金曜日だけ実行され、他の日にはスキップされて次のジョブが実行継続されます。

サンプルワークフロー：15_AdmissionTimes

## (4) ワークフローのイベント実行

ファイル検知などのイベントをきっかけに、ワークフローを実行することができます。

#### 1. ファイル監視によるワークフロー実行

任意のエージェントが稼働するサーバーのディレクトリ及びファイルを監視して、ファイルが書き込まれたことをきっかけとしてワークフローを実行することができます。

ジョブ定義画面のインベントリーからファイルオーダーソースを選択し、新規作成で名称を入力ます。
![スクリーンショット 2021-12-03 14.10.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52445/9092b5e0-7b04-e435-5b95-482533b13f8a.png)
タイトルは適当に入力し、実行するワークフローとエージェントを選択します。
監視するディレクトリーのフルパスを入力し、パターンに監視するファイル名を入力します。
ファイル名は、完全一致でも部分一致でも可能ですが、部分一致の場合は[Java正規表現](https://docs.oracle.com/javase/jp/8/docs/api/java/util/regex/Pattern.html)を使用します。
例：
すべてのファイル名に一致: .*
.csv拡張子のファイル名に一致: .*\.csv$

遅延には、ファイル検知の間隔（秒）を入力します。
ファイル書き込みを検知してから、タイムスタンプとサイズを監視し、遅延で指定した間隔でもしどちらかが変化していたら再度次の遅延間隔で監視が続けられます。
Windowsの場合ファイル書き込み中は他のプロセスがファイルを開くことができませんが、Linux系の場合書き込み途中でもファイルが開けますので、書き込み途中のものを開かないようにするためです。
大きなファイルを書き込み終了までワークフロー実行させない確実な方法は、ファイル書き込みプログラム側で書き込み時は検知ファイル名とは異なる一時ファイル名を使用し、書き込み完了確認してから検知ファイル名に変更します。

https://kb.sos-berlin.com/display/PKB/JS7+-+File+Watching

サンプルワークフロー：08_FileWatching

ファイルオーダーソースでは、ファイル検知しワークフロー実行後に検知ファイルの処理はしません。
検知ファイルの移動・削除・リネームなどのために**JITLファイル操作ジョブ**が用意されています。

:::note info
JITLファイル操作ジョブは、V.2.1.1以降が必要です
:::

https://kb.sos-berlin.com/display/PKB/JS7+-+JITL+File+Operation+Jobs

ワークフローにこれらのJITLジョブを組み込むによって、一連のファイル処理を穴埋め式で作成できます。

#### 2. APIによるワークフロー実行

JS7® JobSchedulerでは、JOCコックピットからだけでなく、APIから操作を実行できますので、外部アプリケーションからJS7® JobSchedulerのすべての操作が可能です。
APIには、REST APIとPowerShell CLIが用意されていますので環境によって使い分けできます。
詳しくは以下をご参照ください。

https://kb.sos-berlin.com/display/PKB/JS7+-+REST+Web+Service+API

https://kb.sos-berlin.com/display/PKB/JS7+-+PowerShell+Module

# 4. オブジェクト命名規則

JS7®JobSchedulerでは下記のようなオブジェクトが使用できます。
ワークフロー、ジョブ、変数、ロック、ファイルオーダーソース、ジョブリソース、フォルダー、カレンダー、スケジュール
これらのオブジェクト名は、日本語を含むUnicodeで表現できる文字を使用できますが、基本Javaの識別子の命名規則に準じます。

主な制限としては

+ 制御文字は使えません：[^\\x00-\\x1F\\x7F\\x80-\\x9F]
+ dots '.', underscore '_' and dash '-' 以外の句読点は使えません、
+ dots '.', dash '-'は先頭文字に使えません。
+ Javaの予約語は使えません。
+ オブジェクト名最大長は、ルートフォルダーからのパス名を含めて255 Unicode文字
+ オブジェクト名はオブジェクトタイプ（ワークフロー、ジョブ、スケジュールなど）毎に一意（ユニーク）である必要があります。

詳しくは以下をご参照ください。

https://kb.sos-berlin.com/display/PKB/JS7+-+Object+Naming+Rules

# 5. その他ナレッジベースリンク

JS7® JobSchedulerワークフロー間連携　https://qiita.com/satoruf/items/64b185880f4ac0e05c5d

https://kb.sos-berlin.com/display/PKB/JS7+-+How+To

https://kb.sos-berlin.com/display/PKB/JS7+-+FAQ

https://kb.sos-berlin.com/display/PKB/JS7+-+Troubleshooting