當前為10.0版本文檔,更多實例內容將在最新幫助文檔中展現,點選跳轉至 最新版幫助文檔

定時任務之條件判斷

一、概述

1
版本。
報表伺服器版本JAR新增功能
10.02020-06-08【調度週期】→【執行條件】→【自訂類判斷】中可新增參數並指派

2
功能簡介。
  1. 定時任務條件判斷是指在執行定時任務之前進行一次校驗判斷,如果不滿足條件就不執行或者延遲後再次校驗執行。

  2. 條件判斷包含三種型別的選擇:【始終執行】、【公式判斷】和自訂類判斷。

  3. 始終執行,就是不進行條件判斷,直接執行定時任務,下面介紹公式判斷和自訂類判斷。

注:若在調度周期步驟中勾選「任務重啓」,延遲一段時間後再次校驗執行。

二、公式判斷

  1. 公式判斷就是指定時任務在執行前要對當前公式內容進行判定,公式為真則繼續執行定時任務,如果公式為假則不執行或者延遲執行。

  2. 延遲執行是指在調度週期步驟中勾選【任務重啓】,會在間隔一段設定的時間後再次執行定時任務,重新進行條件判斷,以此類推,當重啓次數達到設定值的時候,條件判斷還是不滿足,則不執行,如果中間有一次滿足則執行定時任務。

1
範本準備。
  1. 開啟範本 【%FR_HOME%\webapps\webroot\WEB-INF\reportlets\doctw\Advanced\Cacuate_Between_Cells\日報.cpt】,查詢一段時間內的資料資訊情況。

2
新增任務。
  1. 管理者進入數據決策系統,點選【管理系統】→【排程管理】→【新增任務】,如下圖所示。

3
基本設定。
  1. 【任務名稱】為【公式判斷】,新增平台使用者【demo】,點選【確定】,如下圖所示。

4
調度物件。
  1. 點選【下一步】,選擇範本為【日報.cpt】,點選【設定參數預設值】,檔案名稱稱為【${now()}】 ,如下圖所示。

5
調度週期。
  1. 點選【下一步】,設定調度週期,執行條件選擇【公式判斷】,在右側的公式輸入框中輸入【E3>50】,勾選【如果任務中斷按以下頻率重新啟動】,設定【兩次重啓間隔】為 【1】 分鍾,【最多嘗試重啓次數】為 【2】 次,如下圖所示。

  2. 其中公式的含義及任務重啓設定的含義如下表所示。

設定項備注
公式:E3>50表示定時任務綁定的範本中 E3 儲存格大於 50 才能滿足條件,可以執行定時任務,否則不執行或延遲校驗執行。
任務重啓設定項如果 E3 儲存格內容小於 50 則進行任務重啓,每隔一分鍾重啓一次,重啓後再公式判斷,公式判斷還是不滿足則再次任務重啓,直到重啓過 2 次後,若公式判斷還是不滿足,則不執行。

6
檔案處理。
  1. 點選【下一步】,選擇【平台通知】,主題為 【FRTest】 ,內容為【公式判斷】,點選【儲存】按鈕,如下圖所示。

7
結果查看。
  1. 運作後在【任務管理】可以看到公式判斷任務已經運作結束,如下圖1所示。

  2. 點選【運作監視】,查看該任務執行的監視,如下圖2所示。

  3. 由運作監視可知,任務重啓了兩次,範本都不滿足執行條件,不執行直接跨越直至重啓最大設定次數,然後結束。

三、自訂類判斷

  1. 自訂類判斷是指執行自訂類,傳回值為 true 的時候執行定時任務。

  2. 定時任務的自訂類需要實現 【com.fr.schedule.base.provider.ExecuteCondition】 API,該API有一個方法 【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);//星期二的dow等於3
    return (dow) == 3;
    }
    }
    顯示代碼
  2. 編譯之後的 class 檔案儲存到【%FR_HOME%\webapps\webroot\WEB-INF\classes\com\fr\schedule】資料夾下。

  3. 定時任務設定:新增一個定時任務自訂類判斷,在【調度週期】設定【執行條件】時,選擇【自訂類判斷】,點選右側的下拉按鈕,選擇上面儲存的 class 檔案。如下圖1所示。設定完四個步驟之後儲存即可。

  4. 效果查看:如果今天是週二,點選運作監視,可以看到運作資訊顯示成功。

  5. 如果今天不是週二,點選運作監視,可以看到運作資訊顯示【快照生成:跨越】,如下圖2所示。

2
有參數。

注1:2020-06-08 及之後的 JAR,執行條件選擇【自訂類判斷】時,可新增參數並指派。

注2:所新增的參數名稱為字母、數字、中文的組合,參數名稱開頭不能為數字。

  1. 自訂類編寫:點選下載 Java 檔案:NewCondition.zip

  2. 執行定時任務時如果【參數1】的值大於 5 且【參數2】的值包含【ABC】則執行,代碼如下所示。

    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;
    /**
     * @author Cloud.Liu
     * @version 10.0
     * Created by Cloud.Liu on 2020/5/6
     */

    public class NewCondition extends AbstractParameterExecuteCondition {

        @Override
        public boolean execute(List<Map<StringObject>> paramList) {
            FineLoggerFactory.getLogger().error("選擇了新條件類,根據情況跨越");
            //如果參數數量為空,恆成功運作
            if (paramList.size() < 1) {
                return true;
            }
            /*
             * 參數列表:
            * 參數1名稱:參數1
            * 參數1值:一個整數
            * 參數2名稱:參數2
            * 參數2值:一個字串
            *
            * 則這裏的paramList會有兩個Map,對應兩個參數
            * 每個Map有name和value倆項
            * name是參數名 value是參數值
             *
             * 這裏遍曆paramList,取出這倆參數
             */

            int param1 = 0;
            String param2 = StringUtils.EMPTY;
            //遍曆參數列表,給倆參數指派
            for (Map<StringObject> map : paramList) {
                if (StringUtils.equals(GeneralUtils.objectToString(map.get("name")), "參數1")) {
                    param1 = Integer.parseInt(GeneralUtils.objectToString(map.get("value")));
                } else if (StringUtils.equals(GeneralUtils.objectToString(map.get("name")), "參數2")) {
                    param2 = GeneralUtils.objectToString(map.get("value"));
                }
            }
           
            //如果參數1的值大於5且參數2的值包含"ABC" 則執行
           //否則不執行
            if (param1 > 5 && param2.contains("ABC")) {
                return true;
            } else {
                return false;
            }
        }
    }
    顯示代碼
  3. 編譯之後的 class 檔案儲存到【%FR_HOME%\webapps\webroot\WEB-INF\classes\com\fr\schedule】資料夾下。

  4. 定時任務設定:新增一個定時任務自訂類判斷,在【調度週期】設定【執行條件】時,選擇【自訂類判斷】,點選右側的下拉按鈕,選擇上面儲存的 class 檔案,並新增【參數1】和【參數2】,分別指派為 【6 】、【ABC】,如下圖1所示。

  5. 設定完四個步驟之後儲存即可。

  6. 效果查看:點選【運作監視】,可以看到運作資訊顯示成功。若【參數1】和【參數2】的值不滿足【執行條件】,即將【參數1】的值改為【4】,點選【運作監視】,可以看到運作資訊顯示【快照生成:跨越】,如下圖2所示。

四、注意事項

1
LEN 公式取儲存格值不生效。

  1. 問題描述:範本 A1 儲存格中插入了公式 【$fine_username】 ,在【調度週期】步驟中執行條件選擇【公式判斷】,使用 LEN 公式取 A1 儲存格值時不生效。例如使用公式【LEN(report0~A1)】 (FRM 範本中)或 【LEN(A1)】(CPT 範本中)。

  2. 原因分析:LEN 公式使用 A1 儲存格取值,且 A1 儲存格為拓展儲存格時,取到的是包含所有拓展值的一個陣列。

  3. 解決方案:將公式修改為:【LEN(INDEXOFARRAY(report0~A1,1))】(FRM 範本中)或 【LEN(INDEXOFARRAY(A1,1))】(CPT 範本中)。

附件列表


主題: 11.0 新增文檔
  • 有幫助
  • 沒幫助
  • 只是瀏覽

文 檔回 饋

滑鼠選中內容,快速回饋問題

滑鼠選中存在疑惑的內容,即可快速回饋問題,我們將會跟進處理。

不再提示

9s後關閉

反饋已提交

網絡繁忙