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、前端新建定时任务信息(系统监控 -> 定时任务)

  1. 任务名称:自定义,如:定时查询任务状态
  2. 任务分组:根据字典sys_job_group配置。方便去筛选,或者控制任务。扩展:可以加上自定义分组,在sys_job_group中加。
  3. 调用方法(调用目标字符串):设置后台任务方法名称参数
  4. 执行表达式:可查询官方cron表达式介绍
  5. 执行策略:定时任务自定义执行策略。当程序遇到问题的时候,他会去执行的一些策略。
  6. 并发执行:是否需要多个任务间同时执行。一个时间点发了十几次请求,这些请求是并发执行还是一个一个顺序执行。即同步和异步的区别。
  7. 状态:是否启动定时任务
  8. 备注:定时任务描述信息

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

(6)查看调度日志(类调用方式异常)

133 定时任务实现详解

Logo

快速构建 Web 应用程序

更多推荐