1. 概述
1.1 版本
报表服务器版本 |
---|
11.0 |
1.2 应用场景
FineReport 在定时调度中提供了自定义类判断功能。用户可以根据业务需要自己编写自定义类,然后交给系统执行,并根据自定义类的条件返回结果来判断是否执行该定时任务。
1.3 功能简介
FineReport 支持在定时调度任务中,通过自定义类的条件返回结果来判断是否执行定时任务。
FineReport 提供 com.fr.schedule.base.provider.ExecuteCondition 接口,该接口有一个方法 public boolean execute(),完成条件判断逻辑并返回判断结果。如下所示:
当自定义类条件返回结果为 true 时,执行定时任务。
当自定义类条件返回结果为 false 时,不执行或者延迟执行定时任务。
1.3.1 自定义类类型
自定义类判断包括:无参数自定义类判断、有参数自定义类判断。
其中,有参数自定义类判断可以满足定时任务的复用需求,用户可在参数设置面板中添加参数并赋值。如下图所示:
1.3.2 参数设置面板状态
在自定义类判断中,当选择一个具体的自定义类之后,下方会出现参数设置面板,可以在其中添加参数并赋值。
参数设置面板状态如下:
1)添加参数并赋值后,切换自定义类,参数设置面板不会保留原参数设置信息。
2)保存任务后,再次打开任务,可查看到参数设置面板会保留已保存任务的参数设置信息。
注:如果在保存任务后,再次打开该任务切换自定义类,即使再切换回原自定义类,参数设置面板也不会保留原参数设置信息。
1.3.3 参数设置限制
1)参数名称必须为字母、数字、中文的组合,且参数名称开头不能为数字。
2)参数设置中,赋值框默认输入字符串格式,在自定义类中需要对拿到的值进行所需类型转换。
1.4 本章示例
本文将通过具体示例来演示定时调度中自定义类判断功能的使用方法。
示例 | 效果 | 步骤 |
---|---|---|
示例一:无参数自定义类判断 | 在执行定时任务时判断今天是不是周二,如果是周二就执行定时任务,不是周二就不执行定时任务 | 1)准备无参数自定义类 2)设置定时任务 3)执行一次,查看执行效果
|
示例二:有参数自定义类判断 | 如果参数1的值大于 5 且参数2的值包含「ABC」,则执行定时任务 | 1)准备有参数自定义类 2)设置定时任务 3)执行一次,查看执行效果
|
2. 示例一:无参数自定义类判断
本节示例:使用无参数的自定义类判断功能,实现只在周二执行定时任务。
定时任务:推送销售概况报表到销售主管 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 文件保存到%FR_HOME%\webapps\webroot\WEB-INF\classes\com\fr\schedule文件夹下。
注:编译环境准备和编译 Java 文件的详细步骤请参见:编译Java程序。
2.2 设置定时任务
2.2.1 添加任务
管理员登录数据决策系统,点击「管理系统>定时调度>任务管理」,点击「添加任务」,添加一个定时调度任务。如下图所示:
2.2.2 基本设置
1)「任务名称」设置为「周二销售概况通知」。
2)点击「默认用户组」的「编辑」按钮。部门选择销售部的「saleLeader」,点击确定。
注:如需使用平台通知,必须要设置默认用户组,否则消息无法发送给任何人。
如下图所示:
确认部门处已选定「所有部门:销售部:saleLeader; 」,点击「确定」,默认用户组设置完成。点击「下一步」,如下图所示:
2.2.3 调度对象
1)对象类型选择:报表模板
2)选择模板:GettingStarted.cpt
3)文件名称设置:${today()}地区销售概况
点击「下一步」,如下图所示:
2.2.4 调度周期
1)设置执行频率
执行频率选择「明细频率设置」,点击「添加」。
设置执行时间为「18时0分」,执行日为「每日」,执行月为「全选」,点击「确定」,即可成功添加明细频率。
勾选上一步添加的明细频率。
2)设置执行条件
执行条件选择「自定义类判断」。
自定义类选择:2.1 节准备的 ExecuteClass.class 文件。
点击「下一步」。如下图所示:
2.2.5 文件处理
1)处理方式勾选「平台通知」。
2)在「平台通知」设置中:
收件人为:默认用户组
主题为:${today()}地区销售概况
内容为:今日地区销售概况已推送,请及时查看。
链接勾选「定时结果链接在平台内打开」
点击「保存」,如下图所示:
2.3 效果预览
由于该任务的执行频率是每天晚上 18 时执行一次,无法立刻看到任务效果。
为了立刻看到任务效果,可在「管理系统>定时调度>任务管理」界面找到该任务,选择「执行一次」。
1)执行定时任务
执行一次后,如果今天是周二,自定义类 ExecuteClass.class 的条件返回结果为 true,执行该定时任务。
职位「销售部saleLeader」对应的用户 Lisa(Lisa,123456)登录数据决策系统,收到来自定时调度任务的新消息提醒,可查看对应的结果报表。如下图所示:
2)不执行或延迟执行定时任务
如果今天不是周二,执行一次后,自定义类 ExecuteClass.class 的条件返回结果为 false,不执行或延迟执行该定时任务。
点击「定时调度>运行监控」,可以看到任务的运行类型为「快照生成」,状态为「跳过」。如下图所示:
3. 示例二:有参数自定义类判断
本节示例:使用有参数的自定义类判断功能,实现当参数 1 的值大于 5 且参数 2 的值包含「ABC」时,执行定时任务。
定时任务:推送销售概况报表到销售主管 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 文件保存到%FR_HOME%\webapps\webroot\WEB-INF\classes\com\fr\schedule文件夹下。
注:编译环境准备和编译 Java 文件的详细步骤请参见:编译Java程序。
3.2 设置定时任务
3.2.1 添加任务
管理员登录数据决策系统,点击「管理系统>定时调度>任务管理」,点击「添加任务」,添加一个定时调度任务。如下图所示:
3.2.2 基本设置
1)「任务名称」设置为「有参数自定义类判断示例」。
2)点击「默认用户组」的「编辑」按钮。部门选择销售部的「saleLeader」,点击确定。如下图所示:
注:如需使用平台通知,必须要设置默认用户组,否则消息无法发送给任何人。
确认部门处已选定「所有部门:销售部:saleLeader; 」,点击「确定」,默认用户组设置完成。点击「下一步」,如下图所示:
3.2.3 调度对象
1)对象类型选择:报表模板
2)选择模板:GettingStarted.cpt
3)文件名称设置:${today()}地区销售概况
点击「下一步」,如下图所示:
3.2.4 调度周期
1)设置执行频率
执行频率选择「明细频率设置」,点击「添加」。
设置执行时间为「18时0分」,执行日为「每日」,执行月为「全选」,点击「确定」,即可成功添加明细频率。
勾选上一步添加的明细频率。
2)设置执行条件
执行条件选择「自定义类判断」。
自定义类选择:3.1 节准备的 NewCondition.class 文件。
点击「添加」,新增参数并赋值。
新增参数:名称为参数 1,值为 6。
新增参数:名称为参数 2,值为 ABC。
点击「下一步」。如下图所示:
3.2.5 文件处理
1)处理方式勾选「平台通知」。
2)在「平台通知」设置中:
收件人为:默认用户组
主题为:${today()}地区销售概况
内容为:今日地区销售概况已推送,请及时查看。
链接勾选「定时结果链接在平台内打开」
点击「保存」,如下图所示:
3.3 效果预览
由于该任务的执行频率是每天晚上 18 时执行一次,无法立刻看到任务效果。
为了立刻看到任务效果,可在「管理系统>定时调度>任务管理」界面找到该任务,选择「执行一次」。
1)执行定时任务
执行一次后,由于在 3.2.4 节参数设置中,参数 1、参数 2 的值满足参数 1 的值大于 5 且参数 2 的值包含「ABC」的条件,自定义类的条件返回结果为 true,执行该定时任务。
职位「销售部saleLeader」对应的用户 Lisa(Lisa,123456)登录数据决策系统,收到来自定时调度任务的新消息提醒,可查看对应的结果报表。如下图所示:
2)不执行或延迟执行定时任务
点击「编辑」,按照 3.2.4 节步骤修改参数 1 的值为 3,使参数值不满足参数 1 的值大于 5 且参数 2 的值包含「ABC」的条件。如下图所示:
执行一次后,自定义类 NewCondition.class 的条件返回结果为 false,不执行或延迟执行该定时任务。
点击「定时调度>运行监控」,可以看到任务的运行类型为「快照生成」,状态为「跳过」。如下图所示: