タスクスケジューラ実行条件判断

  • 作成者:ayuan0625
  • 編集回数:32次
  • 最終更新:ayuan0625 于 2021-09-30
  • 一.概要

    1. スケジューラタスクは、タスクを実行する直前に条件判断を行います。条件に満足していなければ、実行をやめるか、または時間間隔が過ぎた後、条件判断を繰り返します。スケジューラ周期で[タスクを再起動]が有効にされていれば、間隔が過ぎた後、条件判断を繰り返します。

    2. 実行条件には、常に実行する/数式判断/カスタムクラス判断、三つのタイプがあります。

    3. 常に実行する:条件判断せず、直接的に実行する。本マニュアルでは、数式判断とカスタムクラス判断について紹介します。

    二.数式判断

    数式判断は、タスクが実行される前に、現在の数式に満たしているか判断することです。Trueの場合、タスクを実行しますが、Falseの場合、タスクを終了するか、または再起動間隔が過ぎた後にタスクを再起動します。

     実行の遅延とは、[スケジューラ周期]で[タスクを再起動]を有効にしている時、設定された間隔時間が過ぎた後、タスクをリスタートして、条件判断を繰り返します。こうして、リスタート回数が設定値に達していても、条件に満たしていなければ、実行しません。中で一度でも条件に満たしていれば、タスクが始まります。

    1.スケジューラ周期

    1.ここでは、[入門デモ.cpt]を例にして紹介します。タスクスケジューラの詳しい設定の方法について、[タスクスケジューラ設定手順]をご確認ください。

    2.[次ステップ]をクリックして、タスクのスケジューラ周期を設定します。

    • スケジューラ実行条件を[数式判断]にします。

    • 数式のテキストバーに「D5>20000」を入力して、それを実行条件とします。

    • [タスクが中断した場合は、次の頻度で再起動する]を有効にして、[2つの再起動の間隔]を1分に、[再起動の最大試行回数]を2回にします。

    3.数式の意味とタスク再起動設定の詳しい内容は、下の表の通りです。

    設定項目

    備考

    数式:D5>20000

    スケジューラタスクがバインドしているD5セルが20000より大きい場合にのみタスクを実行します。それ以外の場合、タスクを終了させるか、または再起動の間隔時間が過ぎてから再起動します。

    2つの再起動の間隔

    D5セルの内容が20000より小さければ、タスクを再起動します。間隔時間の1分が過ぎると、条件判断を繰り返します。

    再起動の最大試行回数

    再起動の数式判断も実行条件に満たしていなければ、再びリスタートします。最大試行回数を満たした2回目の再起動も条件に満たしていなければ、実行をやめます。

    2.タスクの結果

    1.実行が終わると、[タスク管理]のページから数式判断のタスクがすでに終了していることを確認できます。下の画像の通りです。

    2.[運行モニタリング]をクリックして、タスク実行のパフォーマンスログを確認します。下の画像の通りです。


    3.[運行モニタリング]から確認できるように、タスクが2回再起動されています。2回とも実行条件に満たしていないので、最大試行回数になるまで実行されずに終わりました。当該タスクは、[実行中のタスク]のリストに表示されていません。

    三.カスタムクラス判断

    カスタムクラス判断:カスタマイズのclassファイルを実行します。結果がTrueの場合、タスクを起動します。

    スケジューラタスクのカスタムクラス機能は、インターフェースcom.fr.schedule.base.provider.ExecuteConditionを利用しています。このインターフェースのファンクションpublic boolean execute()を実行して、条件判断をして結果を戻します。

    1.カスタムクラス設定

    1.例えば、金曜日のみに実行するタスクを設定します。まず、金曜日であるか判断して、金曜日であれば実行します。コードは以下の通りです。

    package com.fr.schedule;
    import java.util.Calendar;
    import com.fr.schedule.base.provider.ExecuteCondition;
     
     
    public class ExecuteClass implements ExecuteCondition {
    public boolean execute() {
    Calendar cal = Calendar.getInstance();
    int dow = cal.get(Calendar.DAY_OF_WEEK);//The dow of Friday is 6
    return (dow) == 6;
    }
    }

    2.コンパイルされたclassファイルを、%FR_HOME%\webapps\webroot\WEB-INF\classes\com\fr\scheduleのフォルダに保存します。

    2.スケジューラ周期

    1.スケジューラタスクにカスタムクラス判断を追加します。スケジューラ周期のページで[実行条件]-[カスタムクラス判断]を選びます。[カスタムクラス]の右側のプルダウンリストから、新たに作成したclassファイルを選びます。下の画像の通りです。

    2,四ステップの設定が終わると、[保存]を押します。

     

    3.タスクの結果

    1.今日は金曜日であれば、運行モニタリングをクリックすると、タスクが成功したことを確認できます。

    2.逆に今日は金曜日でなければ、運行モニタリングをクリックすると、実行情報に[スナップショット生成:スキップ]が表示されます。下の画像の通りです。

    四.カスタムクラス判断-パラメータ付き

    注意:2020-06-08及びそれ以降のJARファイルでは、実行条件を[カスタムクラス判断]にしている場合、パラメータを追加し数値を代入することができます。

    1.カスタムクラスのプログラミング

    1.スケジュールタスクのパラメータ1の数値が5より大きく、パラメータ2の数値に「ABC」が含まれていれば実行します。コードは下の画像の通りです。

    パラメータは、英数字、漢字・かな・カナをサポートしているが、最初の1桁を数字にしてはいけません。

    package com.fr.schedule;
    import com.fr.general.GeneralUtils;
    import com.fr.log.FineLoggerFactory;
    import com.fr.schedule.base.provider.impl.AbstractParameterExecuteCondition;
    import com.fr.stable.StringUtils;
    import java.util.List;
    import java.util.Map;
     
    public class NewCondition extends AbstractParameterExecuteCondition {
        @Override
        public boolean execute(List<Map<String, Object>> paramList) {
            FineLoggerFactory.getLogger().error("New condition, skip");
            if (paramList.size() < 1) {
                return true;
            }
            int param1 = 0;
            String param2 = StringUtils.EMPTY;
            for (Map<String, Object> map : paramList) {
                if (StringUtils.equals(GeneralUtils.objectToString(map.get("name")), "Param 1")) {
                    param1 = Integer.parseInt(GeneralUtils.objectToString(map.get("value")));
                else if (StringUtils.equals(GeneralUtils.objectToString(map.get("name")), "Param 2")) {
                    param2 = GeneralUtils.objectToString(map.get("value"));
                }
            }
            if (param1 > 5 && param2.contains("ABC")) {
                return true;
            else {
                return false;
            }
        }
    }

    2.コンパイルされたclassファイルを、%FR_HOME%\webapps\webroot\WEB-INF\classes\com\fr\scheduleのフォルダに保存します。

    2.スケジューラ周期

    1.スケジューラタスクにカスタムクラス判断を追加します。スケジューラ周期のページで[実行条件]-[カスタムクラス判断]を選びます。

    2.[カスタムクラス]の右側のプルダウンリストから、新たに作成したclassファイルを選び、[パラメータ1]に[6]を代入し、[パラメータ2]に[ABC]を代入します。下の画像の通りです。

    3.タスクの結果

    1.運行モニタリングをクリックすると、タスクが成功したことを確認できます。下の画像の通りです。

    2.パラメータ1とパラメータ2が[実行条件]に満たしていなければ、例えばパラメータ1を[4]に変えることにします。運行モニタリングページに[スナップショット生成:スキップ]が表示されています。下の画像の通りです。 

    五.注意事項

    問題の概要

    例えば、テンプレートのA1セルに数式$fine_usernameを挿入しており、[スケジューラ周期]で[数式判断]を実行条件にしていることにします。LEN数式でA1セルの数値を取得することができません。例えば、frmテンプレートで数式LEN(report0~A1)を、cptテンプレートで数式LEN(A1)を実行することにします。

    原因:

    len数式はA1のセルを読み取っています。A1は拡張セルであるので、読み取られるものはA1に含まれているすべてのセルからなったリストであります。

    解決方法:

    frmテンプレートでは、LEN(INDEXOFARRAY(report0~A1,1))に、cptテンプレートでLEN(INDEXOFARRAY(A1,1))に修正します。


    Attachment List


    Theme: FineReport 管理ポータル
    既に最初
    既に最後
    • Helpful
    • Not helpful
    • Only read