Springboot中如何使用quartz

首先我们导入依赖

 1. 使用springboot在导包的时候首先应该想到看看官网是否有spring-boot-starter-* 类似的官方包 
 2. 其次再看是否有	*-boot-starter 这种第三方包
  • 像quartz这种最常用的调度任务包springboot已经在官网默认集成了
  • 例如在官网文档中有如下图链接
    Springboot中如何使用quartz_第1张图片
  • 有该配置类说明就有quartz的官方starter包 我们直接引入即可(2.1.6)
<dependency>
    <groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
  • 添加配置类
    1. 首先spring使用FactoryBean(不要与BeanFactory混淆了)去创建特殊的bean ,
    2. 在spring中实现了两种与jobDetail有关的FactoryBean,一种JobDetailFactoryBean,一种MethodInvokingJobDetailFactoryBean 这两种的目的其实都是通过工厂创建jobDetail(job的定义类)
  • 首先我们使用MethodInvokingJobDetailFactoryBean去集成quartz

  • 第一步:定义quartz配置类
@Configuration
public class QuartzConfig {

}
  • 第二步:在配置类中添加bean
/**
     * 定义job
     *
     * @return
     */
    @Bean
    public MethodInvokingJobDetailFactoryBean ctsJobDetail(Job job) {
        MethodInvokingJobDetailFactoryBean factoryBean = new MethodInvokingJobDetailFactoryBean();
        factoryBean.setGroup("job");
        factoryBean.setName("run"); //定义job类中的方法名
        factoryBean.setTargetObject(job); //目标类也就是要执行job的类
        factoryBean.setTargetMethod("exec");
        factoryBean.setConcurrent(false);
        return factoryBean;
    }
  • 第三步: 定义一个普通类
@Component
public class Job  {
   public void run() {
       System.out.println("我是job");
   }
}
  • 在quartz配置类定义Trigger(与上面类似spring中也定义了两种Trigger的FactoryBean)(我们使用CronTriggerFactoryBean
 @Bean("ctsTriggerFactoryBean")
    public CronTriggerFactoryBean ctsTriggerFactoryBean(MethodInvokingJobDetailFactoryBean ctsJobDetail) {
        CronTriggerFactoryBean cronTriggerFactoryBean = new CronTriggerFactoryBean();
        cronTriggerFactoryBean.setName("ctsTrigger");
        cronTriggerFactoryBean.setJobDetail(ctsJobDetail.getObject());
        cronTriggerFactoryBean.setCronExpression("0 0/1 * * * ? ");
        return cronTriggerFactoryBean;
    }
  • 按理来说我们还应该定义SchedulerFactoryBean调度器,但是springboot自动配置已经配置了默认调度器(所以我们无需配置)
    Springboot中如何使用quartz_第2张图片
    这样我们就可以直接运行启动应用进行调度任务执行

  • 但是使用MethodInvokingJobDetailFactoryBean虽然简单但是在使用quart jdbc模式时候会报无法序列化问题

  • 因此我们使用第二种JobDetailFactoryBean

  • 第一步定义JobDetailFactoryBean

 @Bean(name = "jobDetail1")
    public JobDetailFactoryBean jobDetail1(){
        JobDetailFactoryBean jobDetailFactoryBean = new JobDetailFactoryBean();
        jobDetailFactoryBean.setJobClass(Job.class);
        jobDetailFactoryBean.setDurability(true);
        jobDetailFactoryBean.setName("job1");
        jobDetailFactoryBean.setGroup("job1");
        return jobDetailFactoryBean;
    }
  • 第二步: 定义job类(必须继承QuartzJobBean)
@DisallowConcurrentExecution //不开启并发
public class FillUpPhysicalStrengthHandler extends QuartzJobBean{
    @Override
    protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
        System.out.println("1");
    }
}
  • 第三步:定义Trigger(与上边类似)
    @Bean(name = "cronTriggerFactoryBean1")
    public CronTriggerFactoryBean cronTriggerFactoryBean1 (@Qualifier(value = "jobDetail1") JobDetailFactoryBean jobDetail1) {
        CronTriggerFactoryBean cronTriggerFactoryBean = new CronTriggerFactoryBean();
        cronTriggerFactoryBean.setJobDetail(jobDetail1.getObject());
        cronTriggerFactoryBean.setCronExpression("0 0/1 * * * ? ");
        return cronTriggerFactoryBean;
    }
  • 第四步: 配置application
spring:
  quartz:
   job-store-type: jdbc #使用数据库存储定时任务
   jdbc:
     initialize-schema: always
   overwrite-existing-jobs: true #每次重启覆盖原有jobs
  • 第五步 : 执行数据库脚本 导入quartz需要的表,在\org\quartz-scheduler\quartz\2.3.1\quartz-2.3.1.jar!\org\quartz\impl\jdbcjobstore 下有各种sql脚本按自己数据库导入即可。

你可能感兴趣的:(java)