任务调度

# 任务调度

# 目录

  • 基本任务调度
  • 分布式任务调度

# 基本任务调度

方案1: 通过 @Cron 注解,这个需要依赖 cron4j 框架:

//1分钟执行一次
@Cron("*/1 * * * *")
public class MyTask implements Runnable {

    @Override
    public void run() {
        System.out.println("task running...");
    }
}

Cron表达式详解:

Cron 表达式最多只允许五部分,每部分用空格分隔开来,这五部分从左到右依次表示分、时、天、月、周,其具体规则如下:

  • 分 :从 0 到 59
  • 时 :从 0 到 23
  • 天 :从 1 到 31,字母 L 可以表示月的最后一天
  • 月 :从 1 到 12,可以别名:jan", "feb", "mar", "apr", "may", "jun", "jul", "aug", "sep", "oct", "nov" and "dec"
  • 周 :从 0 到 6,0 表示周日,6 表示周六,可以使用别名: "sun", "mon", "tue", "wed", "thu", "fri" and "sat"

如上五部分的分、时、天、月、周又分别支持如下字符,其用法如下:

  • 数字 n:表示一个具体的时间点,例如 5 * * * * 表示 5 分这个时间点时执行
  • 逗号 , :表示指定多个数值,例如 3,5 * * * * 表示 3 和 5 分这两个时间点执行
  • 减号 -:表示范围,例如 1-3 * * * * 表示 1 分、2 分再到 3 分这三个时间点执行
  • 星号 *:表示每一个时间点,例如 * * * * * 表示每分钟执行
  • 除号 /:表示指定一个值的增加幅度。
    • 例如 */5表示每隔5分钟执行一次(序列:0:00, 0:05, 0:10, 0:15 等等)。
    • 再例如3-18/5 * * * * 是指在从3到18分钟值这个范围之中每隔5分钟执行一次(序列:0:03, 0:08, 0:13, 0:18, 1:03, 1:08 等等)。

方案2: Jboot 通过 ScheduledThreadPoolExecutor 封装一个轻量的任务调度框架,使用方法如下:

@FixedDelay(period = 5)
public class MyTask implements Runnable {

    @Override
    public void run() {
       System.out.println("task running...");
    }
}

注意:由于 jdk ScheduledThreadPoolExecutor 自身实现的问题,任务的 run 方法如果抛出异常,会造成线程池停止调度, 请务必在任务的 run 方法中使用 try catch 自行捕捉异常。

方案3: 使用 JFinal 自带的任务调度方案,参考文档:https://www.jfinal.com/doc/9-1

# 分布式任务调度

分布式任务在以上的 基本任务调度 的基础上,只需要添加 @EnableDistributedRunnable 注解即可,例如:

示例1:

@Cron("*/1 * * * *")
@EnableDistributedRunnable
public class MyTask implements Runnable {

    @Override
    public void run() {
        System.out.println("task running...");
    }
}

示例2:

@FixedDelay(period = 5)
@EnableDistributedRunnable
public class MyTask implements Runnable {

    @Override
    public void run() {
        System.out.println("task running...");
    }
}

注意:分布式任务调度需要依赖 redis,因此,在使用分布式任务之前需要做好如下配置:

jboot.redis.host = 127.0.0.1
jboot.redis.password =