132 定时任务相关使用 | RuoYi(单独启动)
1、后台添加定时任务处理类(支持Bean
调用、Class
类调用)
(1)bean调用
bean调用:需要添加对应Bean
注解@Component
或@Service
。调用方式:ryTask.ryParams('ry')。其中ryTask(bean的名称,如@Component("ryTask")),ryParams(方法名称,' ry '带参数)。
/**
* 定时任务调度测试
*
* @author ruoyi
*/
@Component("ryTask")
public class RyTask
{
public void ryMultipleParams(String s, Boolean b, Long l, Double d, Integer i)
{
System.out.println(StringUtils.format("执行多参方法: 字符串类型{},布尔类型{},长整型{},浮点型{},整形{}", s, b, l, d, i));
}
public void ryParams(String params)
{
System.out.println("执行有参方法:" + params);
}
public void ryNoParams()
{
System.out.println("执行无参方法");
}
}
(2)class调用
class调用:com.ruoyi.quartz.task.RyTask.ryParams('ry'),不需要加注解。com.ruoyi.quartz.task.RyTask.ryParams,全限定方法名(可带参数)。
(3)代码中的调用方式:feign调用(建议)、依赖子模块后调用
正常情况下,定时任务里面是没有业务逻辑的。所以代码调用的话有两种方式:
第一种feign调用。因此,需要依赖于ruoyi-api-system。
第二种:就是可以依赖于别的其他的子模块。但是这种方式需要自己做拆分,比如说,ruoy-system模块依赖ruoyi-job模块后直接调用。那你就需要把ruoyi-system的service拆出来,拆出来之后,然后在ruoyi-job 的pom.xml引用,然后再去调。
我这边演示open feign的调用,因为我们ruoyi-api-system中的api都已经写好了,我们直接调就好了。
2、前端新建定时任务信息(系统监控 -> 定时任务)
- 任务名称:自定义,如:定时查询任务状态
- 任务分组:根据字典
sys_job_group
配置。方便去筛选,或者控制任务。扩展:可以加上自定义分组,在sys_job_group中加。
- 调用方法(调用目标字符串):设置后台任务方法名称参数
- 执行表达式:可查询官方
cron
表达式介绍 - 执行策略:定时任务自定义执行策略。当程序遇到问题的时候,他会去执行的一些策略。
- 并发执行:是否需要多个任务间同时执行。一个时间点发了十几次请求,这些请求是并发执行还是一个一个顺序执行。即同步和异步的区别。
- 状态:是否启动定时任务
- 备注:定时任务描述信息
3、点击执行一次,测试定时任务是否正常及调度日志是否正确记录,如正常执行表示任务配置成功。
执行策略详解:立即执行
(所有misfire
的任务会马上执行)打个比方,如果9点misfire
了,在10:15系统恢复之后,9点,10点的misfire
会马上执行
每天9点钟去执行这个定时任务,但是某个时间段系统挂掉了,导致这个时间段定时任务没有执行成功。然后过了一个小时之后,他系统又恢复了。那么此时就会把这个定时任务马上执行一遍。就相当于你挂掉的这个任务没执行成功,我恢复了之后,马上回去执行。
执行一次
(会合并部分的misfire
,正常执行下一个周期的任务)假设9,10的任务都misfire
了,系统在10:15分起来了。只会执行一次misfire
,下次正点执行。
任务每小时去执行一次,服务器down掉了一天(24个小时)。恢复后本来要执行24次补回来的,但我不想执行这么多,我就执行一次就好了。
放弃执行
(所有的misfire
不管,执行下一个周期的任务)
系统恢复后,不做任何操作,按正常的cron继续执行就好了。
4 演示:新增、测试定时任务
(1)RyTask.java:新增 ryTest方法
public void ryTest(String params)
{
System.out.println("类调用-参数" + params);
}
(2)前端:新增定时任务(在线工具:Cron - 在线Cron表达式生成器 (ciding.cc))
(3)测试方案1:点击执行一次
(4)测试方案2:状态改成可用,正常跑,看日志
5 任务详情:详解
可以通过" 下次执行时间 "核对cron表达式是否正确
6 调度日志:查看每次执行的状态(失败 或 成功)、如果有异常也会显示出来、任务执行消耗的时长
7 演示:代码中的open feign调用定时任务
(1)ruoyi-job#pom.xml:依赖于ruoyi-api-system模块
<!--
当然你有哪个模块有暴露这个feign调用的话,你就可以直接依赖哪个模块啊,这边的话是直接要用默认的这个系统aip模块(ruoyi-api-system)的。
-->
<dependency>
<groupId>com.ruoyi</groupId>
<artifactId>ruoyi-api-system</artifactId>
</dependency>
(2)RyTask.java:新增 ryTest方法
@Component("ryTask")
public class RyTask
{
@Autowired
private RemoteUserService remoteUserService;
public void ryTest(String params)
{
R<LoginUser> loginUser = remoteUserService.getUserInfo(params, "from-source");
System.out.println("类调用-参数" + loginUser.getData().getUserid());
System.out.println("类调用-参数" + loginUser.getData().getSysUser());
}
}
(3)重启、测试成功
(4)类调用方式,异常处理方案1:这边的话是class调用,class调用的话,它是找不到这个bean的啊,我们要通过bean的方式去调用啊
(5)类调用方式,异常处理方案2:SpringUtils.getBean
@Component("ryTask")
public class RyTask
{
@Autowired
private RemoteUserService remoteUserService = SpringUtils.getBean(RemoteUserService.class);
public void ryTest(String params)
{
R<LoginUser> loginUser = this.remoteUserService.getUserInfo(params, "from-source");
System.out.println("类调用-参数" + loginUser.getData().getUserid());
System.out.println("类调用-参数" + loginUser.getData().getSysUser());
}
}