JS7® JobScheduler WorkFlow Cycle 処理

# 概要

WorkFlowのCycle 処理について解説します。
毎時実行、10分おきに実行などの繰り返し処理の定義となります。

# 前提条件

- JS7 jobscheduler の環境準備、初期設定を済ませていること。
まだの方はこちらから
[JS7® JobScheduler 初期設定、サンプルWorkFlowの登録](https://qiita.com/saitamanokusa/items/2d3162b688329f5ecae2)
- WorkFlowの作成、実行、ログ確認などの基本操作ができること。
  こちらで簡単な操作説明をしています
  [JS7 JobScheduler 初めてのWorkFlow実行](https://qiita.com/saitamanokusa/items/1e5ab48cd2e9d38e035c)
- 本記事はJobScheduler Ver. 2.3.2 で確認した内容です。
今後内容が変わる可能性があります。

# Cycle処理の設定概要

Cycle処理の設定は、大きく「Cycle Type」と、「Period(対象時間帯)」の２つがあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529537/0d186f43-da09-a194-400c-9c0429b2584c.png)

## 動作イメージ

Period Begin 08:00 Duration 12h の動作イメージです（単純に1時間ごとの処理とします）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529537/2c185202-da71-8e03-49d6-f64a76836762.png)

- 8:00から20:00までの時間帯で、Cycle処理が実行されます。
- Workflowが8時より前に実行開始された場合は、8:00 まで待機します。
- 8:00に1回目の処理が実行されます。<br>処理の終了時に、Cycle typeの設定に基づいて2回目の時刻9:00がセットされます。
- 9:00に2回目の処理が実行。終了時に次回の時刻がセットされます。（以降繰り返し）
- 19:00の実行後、次回の時刻20:00は終了時刻となるため、Cycle処理はここで終了となります。(20時開始は含まれません！)

# 対象時間帯の設定

Cycle処理を実行する時間範囲を指定します。
どのCycle typeを選ぶ場合でも共通の設定となります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529537/15e6a232-0e8b-f6b1-c06f-bb29b9819c80.png)

- Period Begin： 処理開始時刻
- Duration： 終了時刻にあたる設定（継続時間ではないため注意）
- Weekdays： 対象日指定。指定外の曜日では、処理がスキップされます。<br>通常はEvery Day を選択し、スケジュール定義で実行日を指定すると思います。

8時-20時の間で定期実行の場合
Period Begin `08:00` Duration `12h`

終日定期実行の場合
Period Begin `00:00` Duration `24h`

業務中でお昼休みを除いた時間帯に実行 (複数定義)
Period Begin `09:00` Duration `3h`
Period Begin `13:00` Duration `4h`

# Cycle Typeについて

Ticking、Periodical、Continuous の3タイプが用意されています。

## Ticking

シンプルに時間毎の定期処理をしたい、もしくは5分毎など、細かく実行したい場合に向いています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529537/bb58fa89-51e7-037a-a8c4-674690bb5786.png)

- Interval 繰り返し間隔を指定
単純に繰り返し間隔を設定するだけですので、設定は分かりやすいです。

下記はPeriod Begin `08:00`, Ticking Interval `1h` の動作イメージとなります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529537/32aca436-25b7-3a70-959e-63a0291d54f8.png)

- 8:00の処理実行後、次回の時刻9:00がセットされます。（以降繰り返し）
- 基準は開始時刻(Period Begin)となるため、定刻処理となります。

## Periodical

毎時決まった時刻に実行。`hh:00`, `hh:30` という設定をしたい場合に利用します。
`Ticking`と比べ、柔軟な時刻指定ができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529537/cd0eb0b1-1169-7a3e-24ab-e4d4c86c4cc4.png)

- Period: `1h`で1時間ごと実行
- Offset: 開始(Period Begin)からの指定時間後に実行
  - `0`, `15m`, `30m`, `45m` で、指定時、15分後、30分後、45分後 に実行
  - カンマ区切りで複数指定可能
  `15m, 45m` で 毎時15分／45分に実行
  - スペース区切りで、h m s を合わせて指定可能
  `0m 30s, 30m 30s` で 毎時 00分30秒／30分30秒 に実行

下記はPeriod Begin `08:00`, Period `1h`, Offset `15m, 45m` の動作イメージとなります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529537/1feb3c19-72e3-ca3b-7238-0b5755c42a8a.png)

- 8:15の処理実行後、次回の時刻8:45がセットされます。（以降繰り返し）
- 基準は開始時刻(Period Begin)となるため、定刻処理となります。

## Continuous

こちらは、Ticking、Periodicalとは異なり、指定回数実行したら終了となります。
cron置き換えというよりも、単に指定回数の繰り返し処理を組みたい場合に向いています。
（他のタイプと違って、定刻処理にはならないため注意。徐々に開始時刻がずれていきます）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529537/fe5706a4-6c7a-2091-543e-6e912278aeac.png)

- Pause  間隔(処理終了後の一時停止時間)
- Limit　繰り返し回数を指定

下記はPeriod Begin `08:00`, Pause `1h`, Limit `5` の動作イメージとなります。<br>（処理の実行に10分間かかるものとする）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529537/5b79a467-1561-2e96-e345-0b9addf49cb0.png)

- 8:00の処理を実行後、Pause時間を加えた次回の時刻9:10がセットされます。（以降繰り返し）
- 指定回数（5回）実行後、処理は終了となります。
　※先に Duration で指定した時間帯を過ぎる場合、その時点で終了となります。
- 基準は処理終了時刻となるため、2回目以降、徐々に開始時刻がずれていきます。

# 注意　2回連続実行される可能性について

`Ticking`、`Periodical` などの定刻処理を選んだ場合、開始時刻の設定や、controller, agent をメンテナンス停止した場合など、タイミングによっては処理が2回続けて実行される可能性があります。
従って、2回続けて実行されても問題のない処理を対象とすることをおすすめします。
※あくまで1回目終了後、即2回目が実行されます。同時に動く訳ではありません。

ご参考までに、例えば下記のような場合に2回連続実行されることを確認しています。

## Agent メンテナンス停止を行った場合の例

毎時00分実行の繰り返し処理
8:00 実行 → 次回 9:00 スケジュール
メンテナンス停止 8:30 - 10:30

この場合、10:30 の再開後、下記のような動作をすることを確認しています。（2回続けて処理が動く）

- 10:30のagent再開時に、9:00 スケジュール分実行<br>次回スケジュール 10:00でセット (直前の処理時刻でセットされる)
- 10:00 スケジュール分実行　次回スケジュール 11:00にセット

## 開始時刻の設定不備による例

Scheduler開始時刻より早く、Cycle処理開始時刻が定義されている場合に、下記のような動作をすることを確認しています。（2回続けて処理が動く）

schedule（DailyPlan）では 8:00 開始、Cycle処理は 0:00 開始の場合

- 08:00のWorkflow実行時に、0:00スケジュール分を実行<br>次回スケジュール 8:00でセット
- 8:00スケジュール分を実行、次回スケジュール 9:00がセットされる

:::note info
この問題はVer. 2.4.1 で解消したことを確認しました。
https://change.sos-berlin.com/browse/JS-2012?src=confmacro
:::


# スケジュール定義でのRepeat設定について

スケジュール定義でも繰り返し処理は可能ですが、基本的にはこちらのCycle処理の利用を推奨します。

スケジュール定義でのRepeat設定は、その繰り返し回数分Orderが作成されます。
そのため、Order情報が溢れ、ログの視認性も非常に悪くなります。
またエージェントをメンテナンス停止した場合に、起動後のタイミングで一度に大量のOrderが処理される可能性があります。
WorkFlowのCycle処理を使えば、Orderはあくまで1つとなり、メンテナンス停止時もエージェント起動後より処理が始まるだけです。

# 手動実行時の時刻問題について

手動でWorkflowを実行する場合、実行時刻が0時から9時前の時間帯はCycle処理がうまく実行されずに即時終了する問題を確認しています。<br>（UTC日付で前日と判断されているもよう）
9時を過ぎれば特に問題はないのですが、動作検証をする際は、この点をご留意ください。

:::note
DailyPlanで作成されたOrderは、0:00開始でも正常に動作します。
:::

# 最後に

Cycle処理は設定項目も少なく、触ればすぐに理解できるかと思います。
cron で実行中の処理を移行したい場合の参考になれば幸いです。

# 参考

[JS7 - Cycle Instruction](https://kb.sos-berlin.com/display/PKB/JS7+-+Cycle+Instruction)