用Quartz框架实现 定时任务管理

129 阅读2分钟

随着项目的年限增长,需要定时任务的地方或需求越来越多,怎么管理好自己的定时任务,实现一个简单的定时任务管理显得尤为重要,仅已此篇给需要的码农作为参考,希望对您有些许帮助。

可以使用Java中的Quartz框架来实现定时任务管理,同时使用数据库来配置时间。下面是简单的实现步骤:

1. 在pom.xml中添加Quartz依赖:

xml

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

2. 在数据库中创建一张表,用于存放任务的调度信息。可以根据Quartz提供的默认表结构创建或自行定义:

sql

CREATE TABLE `sys_schedule_job` (
  `job_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '任务ID',
  `job_name` varchar(64) NOT NULL COMMENT '任务名称',
  `job_group` varchar(64) NOT NULL COMMENT '任务分组',
  `cron_expression` varchar(64) NOT NULL COMMENT 'cron表达式',
  `job_status` varchar(1) NOT NULL COMMENT '任务状态(0:停用,1:正常)',
  `class_name` varchar(255) NOT NULL COMMENT '任务执行类',
  `method_name` varchar(255) NOT NULL COMMENT '任务执行方法',
  `create_time` datetime NOT NULL COMMENT '创建时间',
  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
  PRIMARY KEY (`job_id`),
  UNIQUE KEY `uk_job_name` (`job_name`,`job_group`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='定时任务'

3. 创建Job类,实现具体的任务逻辑。如:

public class MyJob implements Job {
    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        // 执行具体的任务逻辑
        System.out.println("myJob is running...");
    }
}

4. 创建JobDetail和Trigger,设置调度时间和相关参数。如:

// 创建JobDetail
JobDetail jobDetail = JobBuilder.newJob(MyJob.class)
    .withIdentity(jobName, jobGroup)
    .build();
 // 创建Trigger
Trigger trigger = TriggerBuilder.newTrigger()
    .withIdentity(jobName, jobGroup)
    .startAt(startDate)
    .withSchedule(CronScheduleBuilder.cronSchedule(cronExpression))
    .build();
 // 调度任务
Scheduler scheduler = new StdSchedulerFactory().getScheduler();
scheduler.start();
scheduler.scheduleJob(jobDetail, trigger);

5. 配置任务调度信息到数据库中。如:

List<ScheduleJob> jobList = scheduleJobMapper.getScheduleJobList();
 // 遍历任务列表,配置任务调度信息
for (ScheduleJob job : jobList) {
    String jobName = job.getJobName();
    String jobGroup = job.getJobGroup();
    String cronExpression = job.getCronExpression();
     // 创建JobDetail
    JobDetail jobDetail = JobBuilder.newJob(MyJob.class)
        .withIdentity(jobName, jobGroup)
        .build();
     // 创建Trigger
    Trigger trigger = TriggerBuilder.newTrigger()
        .withIdentity(jobName, jobGroup)
        .withSchedule(CronScheduleBuilder.cronSchedule(cronExpression))
        .build();
     // 调度任务
    Scheduler scheduler = new StdSchedulerFactory().getScheduler();
    scheduler.start();
    scheduler.scheduleJob(jobDetail, trigger);
}

以上代码仅提供了简单的实现思路,详细的实现还需视具体场景而定。同时,需要注意的是,Quartz的调度器是单例模式,需要在应用程序启动时初始化,并在应用程序关闭时销毁。也推荐大家使用另外一款更好管理项目定时任务的任务调度平台(xxl-job一个分布式的[任务调度]平台,其核心设计目标是:学习简单、开发迅速、轻量级、易扩展,现在已经开放源代码并接入多家公司的线上产品线,开箱即用)后面也会整理下 供大家参考 谢谢您的阅读,望你早日实现金钱自由!