简单定时任务 Quartz

Quartz 的集成与简化

原生的 Quartz 虽然功能强大,但在使用上可能会显得比较复杂。为了简化开发与维护,笔者使用了 tio-utils 对 Quartz 进行了简单封装,使其更加易用。

以下是与 Quartz 集成的主要工具类:

  • com.litongjava.tio.utils.quartz.QuartzUtils
  • com.litongjava.tio.utils.quartz.AbstractJobWithLog

由于 tio-boot 已经内置了 tio-utils,因此在项目中只需添加 Quartz 及其扩展的依赖即可。

<dependency>
  <groupId>org.quartz-scheduler</groupId>
  <artifactId>quartz</artifactId>
  <version>2.3.0</version>
</dependency>
<dependency>
  <groupId>org.quartz-scheduler</groupId>
  <artifactId>quartz-jobs</artifactId>
  <version>2.3.0</version>
</dependency>

创建任务类

接下来,创建一个定时任务类。该类需要继承 AbstractJobWithLog 并重写 run 方法。

import org.quartz.JobExecutionContext;
import com.litongjava.tio.utils.quartz.AbstractJobWithLog;
import lombok.extern.slf4j.Slf4j;

@Slf4j
public class DemoTask extends AbstractJobWithLog {
  @Override
  public void run(JobExecutionContext context) throws Exception {
    log.info("任务执行上下文: {}", context);
  }
}

创建配置文件

src/main/resources/config 目录下创建名为 tio-quartz.properties 的配置文件,用于定义任务的调度规则。例如,每 10 秒执行一次任务,可以配置如下内容:

# 每10秒执行一次
demo.timetask.DemoTask = 0/10 * * * * ?

配置 QuartzUtils.start() 启动任务

在配置类中启动 Quartz,并将其与应用的生命周期进行绑定:

import com.litongjava.jfinal.aop.annotation.AConfiguration;
import com.litongjava.jfinal.aop.annotation.AInitialization;
import com.litongjava.tio.boot.server.TioBootServer;
import com.litongjava.tio.utils.quartz.QuartzUtils;

@AConfiguration
public class QuartzConfig {

  @AInitialization
  public void config() {
    // 启动 Quartz 定时任务
    QuartzUtils.start();

    // 在应用销毁时停止 Quartz
    TioBootServer.me().addDestroyMethod(() -> {
      QuartzUtils.stop();
    });
  }
}

需要注意的是,Quartz 与 hotswap-classloader 无需整合,因为 Quartz 对任务的操作都是静态的。

Cron 表达式说明

Cron 表达式用于指定任务的执行时间,其格式如下:

[秒] [分] [小时] [日] [月] [周] [年]

其中,[年] 是可选的,可以省略。星号 (*) 表示在每个单位时间执行,问号 (?) 用于表示在 [日] 和 [周] 字段中不指定值。

常用 Cron 表达式示例

  1. 每 1 分钟执行一次:

    0 */1 * * * ?
    
  2. 每 5 分钟执行一次:

    0 */5 * * * ?
    
  3. 每 10 分钟执行一次:

    0 */10 * * * ?
    
  4. 每 30 分钟执行一次:

    0 */30 * * * ?
    
  5. 每 1 小时执行一次:

    0 0 */1 * * ?
    
  6. 每 2 小时执行一次:

    0 0 */2 * * ?
    
  7. 每 3 小时执行一次:

    0 0 */3 * * ?
    
  8. 每 6 小时执行一次:

    0 0 */6 * * ?
    
  9. 每 12 小时执行一次:

    0 0 0,12 * * ?
    
  10. 每 24 小时(每天)执行一次:

    0 0 0 * * ?
    

通过以上步骤,可以快速集成并配置 Quartz 定时任务,简化开发过程,提高项目的可维护性。