历史版本26 :定时任务执行条件之公式判断 返回文档
编辑时间: 内容长度:图片数:目录数: 修改原因:

目录:

1. 概述编辑

1.1 版本

报表服务器版本JAR新增功能
10.02020-06-08调度周期>执行条件>自定义类判断中可添加参数并赋值

1.2 功能简介

定时任务条件判断是指在执行定时任务之前进行一次校验判断,如果不满足条件就不执行或者延迟后再次校验执行。

注:若在调度周期步骤中勾选「任务重启」,延迟一段时间后再次校验执行。

条件判断包含三种类型的选择:始终执行公式判断和自定义类判断

始终执行,就是不进行条件判断,直接执行定时任务,下面介绍公式判断和自定义类判断。

2. 公式判断编辑

公式判断就是指定时任务在执行前要对当前公式内容进行判定,公式为真则继续执行定时任务,如果公式为假则不执行或者延迟执行。

延迟执行是指在调度周期步骤中勾选「任务重启」,会在间隔一段设定的时间后再次执行定时任务,重新进行条件判断,以此类推,当重启次数达到设置值的时候,条件判断还是不满足,则不执行,如果中间有一次满足则执行定时任务。

2.1 模板准备

打开模板 %FR_HOME%\webapps\webroot\WEB-INF\reportlets\doc\Advanced\Cacuate_Between_Cells\日报.cpt,查询一段时间内的数据信息情况。

2.2 添加任务

管理员进入数据决策系统,点击管理系统>定时调度>添加任务,如下图所示:

1578366776832238.png

 2.3 基本设置

「任务名称」为公式判断,添加平台用户demo,点击确定,如下图所示:

1582016844196486.png

2.4 调度对象

点击下一步,选择模板为日报.cpt,点击设置参数默认值,文件名称为${now()} ,如下图所示:

1582017436352540.png

2.5 调度周期

点击下一步,设置调度周期执行条件选择公式判断,在右侧的公式输入框中输入E3>50,勾选如果任务中断按以下频率重新启动,设置「两次重启间隔」为 1 分钟,「最多尝试重启次数」为 2 次,如下图所示:

1582017816597950.png

其中公式的含义及任务重启设置的含义如下表所示:

设置项备注
公式:E3>50表示定时任务绑定的模板中 E3 单元格大于 50 才能满足条件,可以执行定时任务,否则不执行或延迟校验执行
任务重启设置项如果 E3 单元格内容小于 50 则进行任务重启,每隔一分钟重启一次,重启后再公式判断,公式判断还是不满足则再次任务重启,直到重启过 2 次后,若公式判断还是不满足,则不执行

2.6 文件处理

点击下一步,选择平台通知,主题为 FRTest ,内容为公式判断,点击保存按钮,如下图所示:

1582018705507947.png

2.7 结果查看

运行后在「任务管理」可以看到公式判断任务已经运行结束,如下图所示:

1582018987340230.png

点击运行监控,查看该任务执行的监控,如下图所示:

1582019100554501.png

由运行监控可知,任务重启了两次,模板都不满足执行条件,不执行直接跳过直至重启最大设置次数,然后结束。

3. 自定义类判断编辑

自定义类判断是指执行自定义类,返回值为 true 的时候执行定时任务。

定时任务的自定义类需要实现 com.fr.schedule.base.provider.ExecuteCondition 接口,该接口有一个方法 public boolean execute(),完成条件判断逻辑并返回判断结果。

3.1 无参数

3.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;
}
}

编译之后的 class 文件保存到%FR_HOME%\webapps\webroot\WEB-INF\classes\com\fr\schedule文件夹下。

3.1.2 定时任务设置

添加一个定时任务自定义类判断,在调度周期设置「执行条件」时,选择自定义类判断,点击右侧的下拉按钮,选择上面保存的 class 文件。如下图所示:

19.png

设置完四个步骤之后保存即可。

3.1.3 效果查看

如果今天是周二,点击运行监控,可以看到运行信息显示成功,如下图所示:

1582019916334458.png

如果今天不是周二,点击运行监控,可以看到运行信息显示快照生成:跳过,如下图所示:

222

3.2 有参数

注1:2020-06-08 及之后的 JAR,执行条件选择自定义类判断时,可添加参数并赋值。

注2:所添加的参数名称为字母、数字、中文的组合,参数名称开头不能为数字。

3.2.1 自定义类编写

1)点击下载 Java 文件:NewCondition.zip

执行定时任务时如果参数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<String, Object>> 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<String, Object> 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;
        }
    }
}

2)编译之后的 class 文件保存到%FR_HOME%\webapps\webroot\WEB-INF\classes\com\fr\schedule文件夹下。

3.2.2 定时任务设置

添加一个定时任务自定义类判断,在调度周期设置「执行条件」时,选择自定义类判断,点击右侧的下拉按钮,选择上面保存的 class 文件,并添加参数1参数2,分别赋值为 ABC,如下图所示:

90.png

设置完四个步骤之后保存即可。

3.2.3 效果查看

点击运行监控,可以看到运行信息显示成功,如下图所示:

1590660954675231.png

参数1参数2的值不满足「执行条件」,即将参数1的值改为4,点击运行监控,可以看到运行信息显示快照生成:跳过,如下图所示:

1590661044281831.png


4. 注意事项编辑

4.1 LEN 公式取单元格值不生效

问题描述:

模板 A1 单元格中插入了公式 $fine_username ,在「调度周期」步骤中执行条件选择公式判断,使用 LEN 公式取 A1 单元格值时不生效。例如使用公式 LEN(report0~A1) (FRM 模板中)或 LEN(A1)(CPT 模板中)。

原因分析:

 LEN 公式使用 A1 单元格取值,且 A1 单元格为拓展单元格时,取到的是包含所有拓展值的一个数组。

解决方案:

将公式修改为:LEN(INDEXOFARRAY(report0~A1,1))(FRM 模板中)或 LEN(INDEXOFARRAY(A1,1))(CPT 模板中)。