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

目录:

1. 概述编辑

1.1 版本

FineBI服务器版本功能变更
6.0-

1.2 应用场景

FineBI 在定时调度中提供了自定义类判断功能。用户可以根据业务需要自己编写自定义类,然后交给系统执行,并根据自定义类的条件返回结果来判断是否执行该定时任务。

1.3 功能详情

FineBI 支持在定时调度任务中,通过自定义类的条件返回结果来判断是否执行定时任务。

FineBI 提供 com.fr.schedule.base.provider.ExecuteCondition 接口,该接口有一个方法 public boolean execute(),完成条件判断逻辑并返回判断结果。

如下所示:

  • 当自定义类条件返回结果为 true 时,执行定时任务。

  • 当自定义类条件返回结果为 false 时,不执行或者延迟执行定时任务。

1.3.1 自定义类类型

自定义类判断包括:无参数自定义类判断、有参数自定义类判断。

其中,有参数自定义类判断可以满足定时任务的复用需求,用户可在参数设置面板中添加参数并赋值。如下图所示:

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

1.3.2 参数设置面板状态

在自定义类判断中,当选择一个具体的自定义类之后,下方会出现参数设置面板,可以在其中添加参数并赋值。

参数设置面板状态如下:

1)添加参数并赋值后,切换自定义类,参数设置面板不会保留原参数设置信息。 

2)保存任务后,再次打该任务,可查看到参数设置面板会保留已保存任务的参数设置信息。 

注:如果在保存任务后,再次打开该任务切换自定义类,即使再切换回原自定义类,参数设置面板也不会保留原参数设置信息。 

1.3.3 参数设置限制

1)参数名称必须为字母、数字、中文的组合,且参数名称开头不能为数字。

2)参数设置中,赋值框默认输入字符串格式,在自定义类中需要对拿到的值进行所需类型转换。

1.4 本章示例

本文将通过具体示例来演示定时调度中自定义类判断功能的使用方法。

示例
效果步骤

示例一:无参数自定义类判断

在执行定时任务时判断今天是不是周二,如果是周二就执行定时任务,不是周二就不执行定时任务

1)准备无参数自定义类

2)准备一张仪表板

3)设置定时任务

4)执行一次,查看执行效果

  • 条件判断结果返回 true,执行定时任务

  • 条件判断结果返回 false,不执行定时任务

示例二:有参数自定义类判断

如果参数 1 的值大于 5 且参数 2 的值包含「ABC」,则执行定时任务

1)准备有参数自定义类

2)准备一张仪表板

3)设置定时任务

4)执行一次,查看执行效果

  • 条件判断结果返回 true,执行定时任务

  • 条件判断结果返回 false,不执行定时任务

2. 示例一:无参数自定义类判断编辑

本节示例:使用无参数的自定义类判断功能,实现只在周二执行定时任务。

定时任务:销售部销售主管 Lisa 的 APP 客户端推送最新的销售明细情况。

示例仪表板:「行业应用>零售电商>销售管理中心驾驶舱」主题下的「产品销售分析」仪表板。

该仪表板调用的数据为:「公共数据>部门数据>销售_Lisa」文件夹中的数据表。

点击下载 Java 文件:ExecuteClass.zip

2.1 准备自定义类

2.1.1 编写 Java 文件

编写ExecuteClass.java,代码如下所示:

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.1.2 编译 Class 文件

1)生成 class 文件

编译 ExecuteClass.java,生成 ExecuteClass.class 文件。

2)导入 class 文件

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

注1:若在 %BI_HOME%\webapps\webroot\WEB-INF\classes\com\fr 下不存在 schedule 文件夹,用户自行新建文件夹 schedule 即可。

注2:编译环境准备和编译 Java 文件的详细步骤请参见编译Java程序

2.2 仪表板准备

2.2.1 复制模板链接

在设置定时调度任务前,需要先获取定时调度中使用的仪表板的链接,以便将仪表板推送给用户 App 端。

1)管理员登录 FineBI 系统,点击「我的分析」。

选中「行业应用>零售电商>销售管理中心驾驶舱」主题下的「产品销售分析」仪表板,URL链接中report后的ID即为仪表板ID。仪表板预览链接形如:http://IP:port/webroot/decision/v5/design/report/仪表板ID/view

注1:链接中的IP不可为「localhost」,必须更换为电脑实际的 IP 地址。

注2:APP端必须可访问该网址,如内外网环境不互通则无法访问。

2.2.2 分配数据权限

用户如需查看定时调度中使用的 BI 模板,必须拥有该仪表板调用的数据表的组件数据权限。

管理员登录FineBI系统,点击「管理系统>权限管理>普通权限配置>权限快速配置」。

选择「部门>销售部>销售主管」,点击「数据权限」,为其分配「公共数据>部门数据>销售_Lisa」文件夹的「组件数据」权限。如下图所示:

2.3 设置定时任务

2.3.1 添加任务

管理员登录 FineBI 系统,点击「管理系统>定时调度>任务管理」,点击「添加任务」,添加一个定时调度任务。如下图所示:

2.3.2 基本设置

1)「任务名称」设置为「销售业绩达成情况」。

2)点击「默认用户组」的「编辑」按钮。部门选择销售部的「销售主管」,点击确定。如下图所示:

注:如需使用平台通知,必须要设置默认用户组,否则消息无法发送给任何人。

确认部门处已选定「所有部门:销售部:销售主管; 」,点击「确定」,默认用户组设置完成。点击「下一步」,如下图所示:

2.3.3 调度对象

1)对象类型选择「BI模板」,选择模板:「行业应用>零售电商>销售管理中心驾驶舱」主题下的「产品销售分析」仪表板。

2)文件名称设置为「${now()}的销售情况」。

点击「下一步」,如下图所示:

2.3.4 调度周期

1)设置执行频率

执行频率选择「明细频率设置」,点击「添加」。

设置执行时间为「18时0分」,执行日为「每日」,执行月为「全选」,点击「确定」,即可成功添加明细频率。

勾选上一步添加的明细频率。

2)设置执行条件

执行条件选择「自定义类判断」。

自定义类选择:2.1 节准备的 ExecuteClass.class 文件。

点击「下一步」。如下图所示:

2.3.5 文件处理

1)处理方式勾选「客户端通知」。

2)在「客户端通知」设置中:

  • 勾选「APP」通知

  • 选择消息类型为「链接消息」

  • 接收人为:「默认用户组」

  • 主题为:${today()}的区域销售情况

  • 邮件内容为:有新的销售统计数据已到达,请及时查收。

  • 勾选「自定义链接」,输入内容为 2.2 节准备好的仪表板预览链接

点击「保存」,如下图所示:

2.4 效果预览

由于该任务的执行频率是每天晚上 18 时执行一次,无法立刻看到任务效果。

为了立刻看到任务效果,可在「管理系统>定时调度>任务管理」界面找到该任务,选择「执行一次」。

1)执行定时任务

职位「销售部>销售主管」对应的用户是Lisa(Lisa,1)。

执行一次后,如果今天是周二,自定义类 ExecuteClass.class 的条件返回结果为 true,执行该定时任务。

Lisa(Lisa,1)登录 FineMobile 数据分析 App,收到一条新消息。如下图所示:

2)不执行或延迟执行定时任务

如果今天不是周二,执行一次后,自定义类 ExecuteClass.class 的条件返回结果为 false,不执行或延迟执行该定时任务。

点击「定时调度>运行监控」,可以看到任务的运行类型为「快照生成」,状态为「跳过」。如下图所示:

3. 示例二:有参数自定义类判断编辑

本节示例:使用有参数的自定义类判断功能,实现当参数 1 的值大于 5 且参数 2 的值包含「ABC」时,执行定时任务。

定时任务:给销售主管 Lisa 的 APP 客户端推送最新的销售明细情况。

示例仪表板:「行业应用>零售电商>销售管理中心驾驶舱」主题下的「产品销售分析」仪表板。

该仪表板调用的数据为:「公共数据>部门数据>销售_Lisa」文件夹中的数据表。

点击下载 Java 文件:NewCondition.zip

3.1 准备自定义类

3.1.1 编写 Java 文件

1)编写NewCondition.java,代码如下所示:

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

3.1.2 编译 Class 文件

1)生成 class 文件

编译 NewCondition.java,生成 NewCondition.class 文件。

2)导入 class 文件

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

注1:若在 %BI_HOME%\webapps\webroot\WEB-INF\classes\com\fr 下不存在 schedule 文件夹,用户自行新建文件夹 schedule 即可。

注2:编译环境准备和编译 Java 文件的详细步骤请参见:编译Java程序

3.2 仪表板准备

3.2.1 复制模板链接

在设置定时调度任务前,需要先获取定时调度中使用的仪表板的链接,以便将仪表板推送给用户 App 端。

1)管理员登录 FineBI 系统,点击「我的分析」。

选中「行业应用>零售电商>销售管理中心驾驶舱」主题下的「产品销售分析」仪表板,URL链接中report后的ID即为仪表板ID。仪表板预览链接形如:http://IP:port/webroot/decision/v5/design/report/仪表板ID/view

注1:链接中的IP不可为「localhost」,必须更换为电脑实际的 IP 地址。

注2:APP端必须可访问该网址,如内外网环境不互通则无法访问。

3.2.2 分配数据权限

用户如需查看定时调度中使用的 BI 模板,必须拥有该仪表板调用的数据表的组件数据权限。

管理员登录FineBI系统,点击「管理系统>权限管理>普通权限配置>权限快速配置」。

选择「部门>销售部>销售主管」,点击「数据权限」,为其分配「公共数据>部门数据>销售_Lisa」文件夹的「组件数据」权限。如下图所示:

3.3 设置定时任务

3.3.1 添加任务

管理员登录 FineBI 系统,点击「管理系统>定时调度>任务管理」,点击「添加任务」,添加一个定时调度任务。如下图所示:

3.3.2 基本设置

1)「任务名称」设置为「销售业绩达成情况」。

2)点击「默认用户组」的「编辑」按钮。部门选择销售部的「销售主管」,点击确定。如下图所示:

注:如需使用平台通知,必须要设置默认用户组,否则消息无法发送给任何人。

确认部门处已选定「所有部门:销售部:销售主管; 」,点击「确定」,默认用户组设置完成。点击「下一步」,如下图所示:

3.3.3 调度对象

1)对象类型选择「BI模板」,选择模板:「行业应用>零售电商>销售管理中心驾驶舱」主题下的「产品销售分析」仪表板。

2)文件名称设置为「${now()}的销售情况」。

点击「下一步」,如下图所示:

3.3.4 调度周期

1)设置执行频率

执行频率选择「明细频率设置」,点击「添加」。

设置执行时间为「18时0分」,执行日为「每日」,执行月为「全选」,点击「确定」,即可成功添加明细频率。

勾选上一步添加的明细频率。

2)设置执行条件

执行条件选择「自定义类判断」。

自定义类选择:3.1 节准备的 NewCondition.class 文件。

点击「添加」,新增参数并赋值。

新增参数:名称为参数 1,值为 6。 

新增参数:名称为参数 2,值为 ABC。 

点击「下一步」。如下图所示:

3.3.5 文件处理

1)处理方式勾选「客户端通知」。

2)在「客户端通知」设置中:

  • 勾选「APP」通知

  • 选择消息类型为「链接消息」

  • 接收人为:「默认用户组」

  • 主题为:${today()}的区域销售情况

  • 邮件内容为:有新的销售统计数据已到达,请及时查收。

  • 勾选「自定义链接」,输入内容为 3.1 节准备好的仪表板预览链接

点击「保存」,如下图所示:

3.4 效果预览

由于该任务的执行频率是每天晚上 18 时执行一次,无法立刻看到任务效果。

为了立刻看到任务效果,可在「管理系统>定时调度>任务管理」界面找到该任务,选择「执行一次」。

1)执行定时任务

职位「销售部>销售主管」对应的用户是Lisa(Lisa,1)。

执行一次后,由于在 3.3.4 节参数设置中,参数 1、参数 2 的值满足参数 1 的值大于 5 且参数 2 的值包含「ABC」的条件,自定义类的条件返回结果为 true,执行该定时任务。

Lisa(Lisa,1)登录 FineMobile 数据分析 App,收到一条新消息。如下图所示:

2)不执行或延迟执行定时任务

点击「编辑」,按照 3.3.4 节步骤修改参数 1 的值为 3,使参数值不满足参数 1 的值大于 5 且参数 2 的值包含「ABC」的条件。如下图所示:

执行一次后,自定义类 NewCondition.class 的条件返回结果为 false,不执行或延迟执行该定时任务。

点击「定时调度>运行监控」,可以看到任务的运行类型为「快照生成」,状态为「跳过」。如下图所示: