JS7® JobScheduler スケジュールの設定

# 概要

JS7 JobSchedulerにおけるスケジュール定義について解説します。
まず基本操作として、営業日スケジュールの設定を行います。
また応用として、いくつかの設定サンプルを取り上げます。
※通常の日付、曜日指定の処理は、触れば分かりますので省略します。

# 前提条件

- 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.1, 2.4.1 で確認した内容です。
今後内容が変わる可能性があります。

:::note warn
本記事では休業日カレンダーを使っての設定例を多く取り上げます。
しかし、Ver 2.5.1以前の環境では、スケジュール定義にて休業日カレンダーを使用した場合、他のスケジュール分も含めて休日のDailyPlanが作られなくなる問題を把握しています。
（※Ver 2.5.2で解消しました）
もし対象バージョン利用の場合は、本記事中で、回避手段も紹介していますので、そちらをご参考ください。
[【補足】休業日カレンダー利用時の回避手段](#%E8%A3%9C%E8%B6%B3%E4%BC%91%E6%A5%AD%E6%97%A5%E3%82%AB%E3%83%AC%E3%83%B3%E3%83%80%E3%83%BC%E5%88%A9%E7%94%A8%E6%99%82%E3%81%AE%E5%9B%9E%E9%81%BF%E6%89%8B%E6%AE%B5)
:::

# JobSchedulerにおけるスケジュール定義

あらかじめ営業日、休業日カレンダーを定義し、そのカレンダーの組み合わせでスケジュールを定義します。
そのため、Cron形式では実現できなかった、営業日、休業日を念頭においたスケジュールを容易に組むことができます。
また、先の予定が可視化できるため、スケジュール定義ミスによる誤作動を防止できます。

# 基本設定（営業日スケジュール）

まずは基本的な設定をおさえるために、営業日処理用のスケジュールを定義します。

## 営業日カレンダーを作成

`Practice`フォルダ以下の、`Automation` - `Calendars` より、新規カレンダーを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529537/366881b4-7bd1-1d9a-6928-1bc8237b7918.png)

名前は、`work_alldays`としてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529537/c00ae7f1-3ffc-431e-ce65-8bd5371059bd.png)

設定は下記のように行います。
※ここでは休日は考慮しなくて構いません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529537/6c621860-733a-46f3-0292-674a142a9463.png)

|項目名|設定値|
|-|-|
|Name|work_alldays|
|Title|毎日（Descriptionに相当）|
|Documantation|（空でよい）|
|Type|Working days (営業日)を選択|
|Valid From |対象期間（空でよい）|
|Valid To |対象期間（空でよい）|

`Included Frequencies`が選択されていることを確認のうえ、`Add Frequency`をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529537/ec040b9f-a658-d5fc-98b2-c39848222655.png)

`Weekdays`を選択し、`Every Day`を選択。`Add Frequency` で追加する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529537/150bc328-3a20-a73a-0d89-9067789fc734.png)

`Every day` が追加されたことを確認し、Releaseしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529537/03f2b323-4d69-4076-988f-9bc211315220.png)

## 休業日カレンダーを作成

同様に、休業日のカレンダーを定義します。

名前は、`nonwork_holidays`としてください。
設定は下記のように行います。
※ここでは休日は考慮しなくて構いません。

|項目名|設定値|
|-|-|
|Name|nonwork_holidays|
|Title|休日（Descriptionに相当）|
|Documantation|（空でよい）|
|Type|Non-working days (休業日)を選択|
|Valid From |対象期間（空でよい）|
|Valid To |対象期間（空でよい）|

`Included Frequencies` が選択されていることを確認のうえ、Add Frequency をクリック

誤って `Excluded Frequencies`を選択しないように注意！
ここではあくまで休業日の対象を選択します。

`Weekdays` を選択し、`Saturday`, `Sunday` を追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529537/3a6d9b0e-eef9-6925-2a9a-7171fa51a895.png)

`National Holidays` を選択し、　`Japan`, `2022` で祝日をまとめて追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529537/e088fc50-0611-b4b9-c0d6-1b22482fca86.png)

`Specific Days` を選択し、会社の休業日を追加（夏季、冬季休暇など）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529537/e8f29f08-86c2-e318-df55-6bf13cd54009.png)

対象を追加したらCloseしてください。

Show Preview で、対象日付を確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529537/8e0ac2cc-a89b-2df4-cb1b-4ba8ec01e64e.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529537/4f1438ae-659c-4116-d1b7-a9e93372b7a4.png)

問題なければReleaseしてください。

## 【参考】周期設定について

カレンダーの対象、除外周期には、下記の設定を複数パターン含めることが可能です。

- Weekdays
  - 毎日、もしくは曜日指定
  - 毎月もしくは月指定が可能（ver. 2.3.1では月指定は動作しない）
- MonthDays
  - 毎月1日、10日、最終日、最終日前日、など
  - 休業日カレンダーとの組み合わせで、毎月第２営業日、最終営業日などの指定が可能
  - 毎月もしくは月指定が可能（ver. 2.3.1では月指定は動作しない）
- Specific Weekdays
  - 第1水曜、第3火曜　最終金曜など
- Specific Days
  - 年月日で直接指定
  - 単発の作業日、会社の休業日などの指定に利用
- Every
  - 5日毎、2週毎、3か月毎、年単位など
- National Holidays
  - 国、年を指定して祝日を設定できる
  - あまり先まで設定しないように注意。12月に翌年の祝日を追加もしくは再設定をするのがよい。
  2021年の祝日は東京五輪の関係で2020年11月末に決まりましたね・・・

## Schedule 設定

次に、今作成したカレンダーを使って、営業日スケジュールを定義します。

`Practice`フォルダ以下の、`Automation` - `Schedules` より、新規スケジュールを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529537/560bae0b-f4cb-21f9-cec5-8b5bee3ce3a4.png)

名前は `sche_WorkdayOrderSample` としてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529537/8985871a-6a9f-3336-16d1-3973045d471e.png)

下記のように設定してください。

|項目名|設定値|
|-|-|
|Name|sche_WorkdayOrderSample|
|Title|営業日処理のサンプル（Descriptionに相当）|
|Documantation|（空でよい）|
|Workflow Names |`/Example.Unix/01_HelloWorld/jduHelloWorld`を選択|
|Plan Order automatically| チェック （DailyPlanサービスによるPlan作成を行う）|
|Submit Order to Controller when planned| チェック （Release時にOrder追加まで行う ※ver 2.5.3にて確認）|

次にカレンダーの割り当てを行います。
`Run-time` をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529537/07507914-02f4-46a2-3b10-e26a7fabeec4.png)

`Assign Working Day Calendar` をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529537/b33d3b2c-9fb3-6e07-1c19-99f9c40e9c9f.png)
先ほど作った`work_alldays` を追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529537/73203e41-e993-d637-a0fc-84d6e7762ca7.png)

追加された`work_alldays`にて、`period` をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529537/62050356-54ef-268d-2ac2-49890cf70c4d.png)

下記のように設定し、Save します。
(私の環境ではIMEを無効にしないとうまくSaveできないです・・・)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529537/2fdf4a8a-611b-b722-e050-6e453bd6a4ff.png)

|項目名|設定値|
|-|-|
|Repeat Interval|Single Start を選択|
|Start Time| `10:00`と入力（任意）  |
|On Non-working Day |`suppress execution`を選択 (休日は実行しない)|

同様に休業日カレンダーを割り当てます。
`Assign Non-Working Day Calendar` から `nonwork_holidays` を追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529537/7da1ec37-2b1c-6fee-b56f-1aab8bb0b4d9.png)

営業日、休業日カレンダーが追加されたことを確認の上、`Show Preview` をクリックしてください。
対象日付が確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529537/105794d3-1b29-370b-16c6-6468640ede89.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529537/26ae3a29-1a88-5bc7-f7db-05e6aa24cfdd.png)

問題なければ、Run-time設定は閉じて、Release してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529537/b781e948-c538-a3ad-edbc-b507bd2509e8.png)

以上でスケジュール定義は完了です。
基本的には、この設定により、営業日スケジュールが追加されます。

（スケジュール定義に従ったOrderの登録は、DailyPlanの機能となります）

## 【参考】Repeat Interval について

Repeat Interval の設定は、通常は `Single Start` を選んでください。
cron での 10分毎に実行、毎時15分に実行などの処理の代替え手段とする場合は、WorkFlow定義で`Cycle処理`を利用することを推奨します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529537/dc38a47c-9595-cd45-0627-4d36a66764aa.png)
スケジュール定義でのRepeat設定は、その繰り返し回数分Orderが作成されます。
そのため、Order情報が溢れ、ログの視認性も非常に悪くなります。
またエージェントをメンテナンス停止した場合に、起動後のタイミングで一度に大量のOrderが処理される可能性があります。
WorkFlowのCycle処理を使えば、Orderはあくまで1つとなり、メンテナンス停止時もエージェント起動後より処理が始まるだけです。

# 応用設定（設定サンプル）

## 週の営業日初日

月曜のみ対象のカレンダーと、休業日カレンダーの組み合わせで実現できます。

カレンダー定義

|項目名|設定値|
|-|-|
|Name|work_monday|
|Title|月曜（Descriptionに相当）|
|Documantation|（空でよい）|
|Type|Working days (営業日)を選択|
|Valid From |対象期間（空でよい）|
|Valid To |対象期間（空でよい）|
|Included Frequencies | `Weekdays` で`Monday` を追加

スケジュールの Run-Time設定

|Type|Calendar|Repeat Interval|Start Time|On Non-working Day|
|-|-|-|-|-|
|営業日|work_monday|Single Start|11:00（任意）|`after non-working day`(翌営業日)|
|休業日|nonwork_holidays|-|-|-|

月曜が休日の週は翌日が対象となっていることをご確認ください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529537/2dc4de60-b3c5-fc22-de6c-78e01849e86a.png)

## 週の最終営業日

週初日と同じ要領で設定できます。

カレンダー定義

|項目名|設定値|
|-|-|
|Name|work_friday|
|Title|金曜（Descriptionに相当）|
|Documantation|（空でよい）|
|Type|Working days (営業日)を選択|
|Valid From |対象期間（空でよい）|
|Valid To |対象期間（空でよい）|
|Included Frequencies | `Weekdays` で`Friday` を追加

スケジュールの Run-Time設定

|Type|Calendar|Repeat Interval|Start Time|On Non-working Day|
|-|-|-|-|-|
|営業日|work_friday|Single Start|12:00（任意）|`before non-working day`(前営業日)|
|休業日|nonwork_holidays|-|-|-|

毎週最終営業日が対象となっていることをご確認ください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529537/81e40a13-c554-127c-9835-f57e541a438a.png)

## 毎月第1営業日

まず営業日のみのカレンダーを定義します。
（Included に Everyday, Excluded に休日を追加）

カレンダー定義

|項目名|設定値|
|-|-|
|Name|work_workingday|
|Title|営業日のみ（Descriptionに相当）|
|Documantation|（空でよい）|
|Type|Working days (営業日)を選択|
|Valid From |対象期間（空でよい）|
|Valid To |対象期間（空でよい）|
|Included Frequencies|`Weekdays`にて`Every Day` を選択|
|Excluded Frequencies|`Weekdays`にて`Saturday`, `Sunday`を追加<br>`National Holidays`にて`Japan`, `2022`で祝日追加<br>`Specific Weekdays`にて休業日を追加|

プレビューではこのような表示となります。（Excludedが赤となる）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529537/6885fde1-7579-30e5-9385-b125c293e5d4.png)

スケジュールの Run-Time設定

|Type|Calendar|Repeat Interval|Start Time|On Non-working Day|
|-|-|-|-|-|
|営業日|work_workingday|Single Start|11:00（任意）|`after non-working day`(翌営業日)|
|休業日|nonwork_holidays|-|-|-|

さらに Restrictions の設定を追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529537/f22e0dbf-1419-c3f4-8e9f-ac89be610d24.png)

`MonthDays`より、`Count from First Day` で `1` のみ選択して追加、Submit
(営業日カレンダーの1番目の日付が対象となる)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529537/65127593-3010-0b39-4e0d-1108aa82c73d.png)

第1営業日が対象となっていることを確認してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529537/8aa915ab-89d4-2d67-847c-eaa38e1feb80.png)

第2営業日、第1～第5営業日、最終営業日（Count from Last Day から追加）なども、同様の方法で設定できます。

## 営業日と休日の処理を分ける

WorkFlow定義との組み合わせで実現可能です。

### WorkFlow定義

あらかじめ、WorkFlow定義にて、Order変数 `is_holiday: bool型 デフォルト値 false` を定義します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529537/2721de5b-8af2-db9e-b42d-65a25006764f.png)

休日にスキップしたい箇所は、If条件で、`$is_holiday == false` の場合のみ実行するように設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529537/75fd0f38-1423-4af4-fbee-96b2bd3cd1b4.png)

### カレンダー定義

休日処理用のカレンダー定義を追加します。

|項目名|設定値|
|-|-|
|Name|work_holiday|
|Title|休業日処理用（Descriptionに相当）|
|Documantation|（空でよい）|
|Type|Working days (営業日)を選択|
|Valid From |対象期間（空でよい）|
|Valid To |対象期間（空でよい）|
|Included Frequencies|`Weekdays`にて`Saturday`, `Sunday`を追加<br>`National Holidays`にて`Japan`, `2022`で祝日追加<br>`Specific Weekdays`にて休業日を追加|

### スケジュール定義

スケジュール定義にて、営業日処理用のスケジュールと、休日処理用スケジュールを、同時刻で実行されるように定義します。

- 営業日処理用
  - カレンダー  work_workingday を使用
  - Order変数  `is_holiday == false` を指定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529537/a0a2940d-1a01-d382-5753-de7fc6b51de0.png)

- 休日処理用
  - カレンダー  work_holiday を使用
  - Order変数  `is_holiday == true` を指定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529537/a898bf5d-09c1-cac8-f30d-1117a247ade4.png)

これで営業日、休業日でWorkFlowの実行内容を分けることができます。

# 【補足】休業日カレンダー利用時の回避手段

Ver 2.5.1以前の環境にて、スケジュール定義にて休業日カレンダーを使用した場合、休業日を考慮しない他のスケジュール分も含めて休日のDailyPlanが作られなくなる問題を把握しています。

これについては、各スケジュール定義にて、何らかの休業日カレンダーを割り当てれば回避可能ですので、この方法をご紹介します。

:::note
Ver 2.5.2 でこの問題は解消しました。
旧バージョン利用者向けに、しばらく回避情報は残します。
:::

## 空の休業日カレンダー定義

まず、対象日が空となる休業日カレンダーを定義します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529537/ca0d0e68-dab1-617e-69a1-ec9899e5cc7e.png)

|項目名|設定値|
|-|-|
|Name|nonwork_dummy|
|Title|休業日なし|
|Documantation|（空でよい）|
|Type|Non-working days (休業日)を選択|
|Valid From |対象期間（空でよい）|
|Valid To |対象期間（空でよい）|
|Included Frequencies|`Weekdays`にて`Every Day` を選択|
|Excluded Frequencies|`Weekdays`にて`Every Day` を選択|

Show Preview を確認し、下記のように全日程が除外日となっていることを確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529537/6b2fae02-9d9c-a4f7-b120-915b3d572812.png)

## スケジュールの定義

休業日を考慮しない、毎日実施のスケジュールの定義を行います。

スケジュールの Run-Time設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529537/dc8ca219-23e3-bc63-90ba-b60a61a5f734.png)

|Type|Calendar|Repeat Interval|Start Time|On Non-working Day|
|-|-|-|-|-|
|営業日|work_alldays|Single Start|10:00（任意）|`ignore non-working day`(休業日でも実行)|
|休業日|nonwork_dummy（任意）|-|-|-|

※`ignore non-working day`を選べば、通常の休業日カレンダーでも構いませんが、区別しやすくdummyを割り当てます。

Show Preview を確認し、休業日が影響していないことを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529537/c1388636-ffd6-ca8d-1eaf-5a91c09f4655.png)

このように、何らかの休業日カレンダーを割り当てることで、休日でもDailyPlanが作成されます。

:::note warn
一部でも休業日カレンダーを用いる場合は、休業日が不要なスケジュール定義においても、このダミー休業日定義を割り当てることをお勧めします。
:::

# 最後に

営業日処理を利用すると、人の業務の流れに合わせた処理の自動化が組みやすくなります。
関連する関係会社、銀行などのカレンダー定義を作り、自動処理の幅を広げることができます。
今よりさらに業務の自動化を推し進めるために、是非マスターしてください。

また、休業日情報（祝日、会社休業日）の毎年のメンテナンスは避けられません。
したがって、休業日情報を含むカレンダーは、できるだけ少なく済ませることをお勧めします。

# 参考

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

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

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