定时任务 - 若依cloud -【 132 ~ 133 】

本文详细介绍了RuoYi系统中如何使用Bean和Class调用定时任务,包括feign调用、Cron表达式的应用,以及前端定时任务配置、测试和执行策略。还涉及了异常处理和调度日志查看的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 定时任务实现详解

### Ruoyi-Cloud 中的定时任务实现 在 RuoYi-Cloud 项目中,定时任务通过集成 Spring Task 来实现。Spring Task 是一种轻量级的任务调度工具,能够方便地管理定时执行的方法。 #### 配置类定义 为了启用定时任务功能,在 `application.yml` 文件中需开启相应的配置项[^3]: ```yaml spring: task: scheduling: pool: size: 10 # 设置线程池大小,默认为单线程 ``` #### 启用定时任务支持 创建一个配置类来启用定时任务的支持,该类需要标注 `@EnableScheduling` 注解以激活定时器的功能: ```java import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.EnableScheduling; @Configuration @EnableScheduling public class ScheduleConfig { } ``` #### 创建定时任务服务接口和服务实现类 假设有一个名为 `ISysStudentService` 的服务接口及其对应的实现类负责学生数据的操作[^1]。可以在其实现类内编写具体的业务逻辑并将其设置成周期性的操作。 ```java @Service @Slf4j public class SysStudentServiceImpl extends ServiceImpl<SysStudentMapper, SysStudent> implements ISysStudentService { @Scheduled(cron = "0 0/5 * * * ?") // 每隔五分钟触发一次 public void checkStudents() { log.info("Checking students..."); // 执行具体的学生检查逻辑... } } ``` 上述代码片段展示了如何利用 `@Scheduled` 注解指定 cron 表达式的格式来进行自定义的时间间隔调用方法。这里每隔五分钟后会自动打印一条日志信息表示正在对学生记录做某种形式上的核查工作。 对于遇到 'npm' 不是内部或外部命令的问题,这通常是由于 Node.js 环境变量未被正确识别所引起的错误。可以尝试重启计算机使环境变量生效;或者手动将 Node.js 的安装路径添加到系统的 PATH 变量当中去[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值