SpringBoot整合自定义quartz实现任务调度

本文介绍如何在SpringBoot项目中,不使用Quartz标准表,通过自定义表配置任务调度,实现项目启动后自动执行任务。具体步骤包括创建自定义表、添加Quartz依赖、实现任务类、配置任务并自动加载。

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

在不引入quartz相关表的情况下,自定义任务调度存储表,实现SpringBoot项目启动后自动执行自定义任务调度类。

1、建立自定义任务调度存储表

DROP TABLE IF EXISTS `bmd_flow_schedule`;
CREATE TABLE `bmd_flow_schedule` (
  `taskID` char(20) NOT NULL,
  `taskName` varchar(32) DEFAULT NULL,
  `taskTypeID` char(20) DEFAULT NULL,
  `taskTypeName` varchar(32) DEFAULT NULL,
  `taskClass` varchar(128) DEFAULT NULL,
  `exp` varchar(64) DEFAULT NULL,
  `taskStatus` char(1) DEFAULT NULL,
  PRIMARY KEY (`taskID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

2、添加quartz的依赖到pom.xml中

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-quartz</artifactId>
        </dependency>
        <dependency>
            <groupId>org.quartz-scheduler</groupId>
            <artifactId>quartz-jobs</artifactId>
            <version>2.3.0</version>
        </dependency>

3、创建任务调度执行类HelloworldJob.java,实现Job接口

package com.example.demo.quartz;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

import java.util.Date;

public class HelloworldJob implements Job {
    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        System.out.println("HelloworldJob start......");
        System.out.println(new Date()+"----Hello world!:" + jobExecutionContext.getJobDetail().getKey());

        System.out.println("HelloworldJob end......");
    }
}

4、在第1步中创建的bmd_flow_schedule表中配置任务调度执行类HelloworldJob.java

INSERT INTO `bmd_flow_schedule` (`taskID`, `taskName`, `taskTypeID`, `taskTypeName`, `taskClass`, `exp`, `taskStatus`) VALUES ('1', 'HelloworldJob', 'VM', '', 'com.example.demo.quartz.HelloworldJob', '0/1 * * * * ? 2019', '1');

5、创建SpringBoot启动后的InitJob方法类,并在InitJob方法中将任务执行类HelloworldJob.java自动加载到quartz中,启动任务。

package com.example.demo.init;

import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

/*
启动即执行特定方法
 */
@Component
public class InitJob  implements ApplicationRunner{
    @Resource
    private JdbcTemplate jdbcTemplate;
    @Override
    @SuppressWarnings("unchecked")
    public void run(ApplicationArguments args) throws Exception {
        System.out.println(new Date());
        SchedulerFactory schedulerFactory = new StdSchedulerFactory();
        Scheduler scheduler = schedulerFactory.getScheduler();
        // 启动scheduler
        scheduler.start();
        List list = jdbcTemplate.queryForList("select taskName,taskClass,exp from  bmd_flow_schedule where taskStatus='1'");
        Iterator it = list.iterator(); //这里需要注意的是要用list的iterator遍历
        if(list.size()>0){
            while(it.hasNext()){
                Map<?, ?> rece = (Map<?, ?>) it.next(); //这里要注意,it.next()得到这一条数据
                System.out.println(rece.get("exp"));
                //1、HelloWorldJob
                String taskClass = rece.get("taskClass").toString();
                String exp = rece.get("exp").toString();
                String taskName = rece.get("taskName").toString();

                Class classObj = Class.forName(taskClass);
                // 创建HelloworldJob的JobDetail实例,并设置name/group
                JobDetail jobDetail = JobBuilder.newJob(classObj)
                        .withIdentity("jobDetailTaskName",taskName)
                        //JobDataMap可以给任务传递参数
                        .usingJobData("jobDetailTaskName",taskName)
                        .build();
                // 创建Trigger触发器设置使用cronSchedule方式调度
                Trigger trigger = TriggerBuilder.newTrigger()
                        .withIdentity("triggerTaskName",taskName)
                        .usingJobData("triggerTaskName",taskName)
                        .startNow()
                        //.withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(5).repeatForever())
                        .withSchedule(CronScheduleBuilder.cronSchedule(exp))
                        .build();
                // 注册JobDetail实例到scheduler以及使用对应的Trigger触发时机
                scheduler.scheduleJob(jobDetail,trigger);
            }
        }
    }
}

6、启动SpringBoot项目,执行任务调度

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值