SpringBoot集成Quartz,动态创建,更新,暂停,唤醒,删除任务调度

本文介绍了如何在SpringBoot中集成Quartz进行任务调度,包括静态配置和动态创建任务。通过JobDetail和Trigger定义任务和触发器,利用SchedulerFactoryBean管理调度器生命周期。此外,还展示了如何动态创建、更新、暂停、唤醒和删除任务,适用于不同类型的定时任务需求。
摘要由CSDN通过智能技术生成

Quartz介绍

Quartz可以实现创建任务,修改任务周期等等功能,可以通过javaconfig配置任务调度,并在启动时执行,也可以动态创建任务。SpringBoot也集成了Quartz框架,并提供spring-boot-starter-quartz依赖。

Quartz中几个核心概念:

  • SchedulerFactoryBean:用来创建,配置一个Scheduler,并管理其生命周期。
  • Trigger:触发器,作用是任务何时执行。通过TriggerBuilder创建实例。
  • JobDetail:定义一个特定的Job,它通过JobBuilder来创建实例。

环境

SpringBoot版本:1.5.14.RELEASE

通过@Configuration静态配置Quartz

POM依赖

引入Quartz的相关依赖

                <!-- quartz -->
		<dependency>
			<groupId>org.quartz-scheduler</groupId>
			<artifactId>quartz</artifactId>
			<version>2.2.3</version>
		</dependency>
		<!-- spring集成quartz -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context-support</artifactId>
		</dependency>
		<!-- 因为SchedulerFactoryBean中依赖了org.springframework.transaction.PlatformTransactionManager,所以需依赖tx相关包,其实还是quartz有个分布式功能,是使用数据库完成的。 -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-tx</artifactId>
		</dependency>

实现步骤

1.创建MethodInvokingJobDetailFactoryBean工厂类,设置目标对象和执行方法

2.通过第一步创建的工厂类创建触发器

3.创建任务调度工厂类,并注册触发器

编写如下配置类:

package com.bcu.springboot.biz.config;

import java.text.ParseException;
import java.util.Date;
import java.util.Locale;

import lombok.extern.slf4j.Slf4j;

import org.quartz.CronTrigger;
import org.quartz.Trigger;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.format.datetime.DateFormatter;
import org.springframework.scheduling.quartz.CronTriggerFactoryBean;
import org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;
import org.springframework.stereotype.Component;


@Configuration
@Slf4j
public class QuartzConfig {
    
	/**
	 * 创建工厂bean,实现自定义调度类
	 * @return
	 */
	@Bean
	public MethodInvokingJobDetailFactoryBean createFactoryBean(){
		MethodInvokingJobDetailFactoryBean factoryBean = new MethodInvokingJobDetailFactoryBean();
		//设置执行对象
		factoryBean.setTargetBeanName("quartzTask");
		//设置执行方法
		factoryBean.setTargetMethod("quartzTask");
		//设置任务是否并发执行,true:任务并发执行,false:上一个任务执行完,下一个任务才开始执行
		factoryBean.setConcurrent(true);
		return factoryBean;
	}
	
	
	/**
	 * 通过工厂bean创建trigger触发器
	 * @param factoryBean
	 * @return
	 * @throws ParseException 
	 */
	@Bean
	public Trigger cronTrigger(MethodInvokingJobDetailFactoryBean factoryBean) throws ParseException{
		CronTriggerFactoryBean triggerBean = new CronTriggerFactoryBean();
		//设置trigger所属的工厂bean
		triggerBean.setJobDetail(factoryBean.getObject());
		//设置执行周期
		triggerBean.setCronExpression("0/3 * * * * ?");
		triggerBean.setName("customTrigger");
		//在bean属性填充完成后,执行初始化,如果配置出错则抛出异常
		triggerBean.afterPropertiesSet();
		return triggerBean.getObject();
	}
	
	/**
	 * 创建调度工厂类,自动注册trigger
	 * @param triggers
	 * @return
	 */
	@Bean
	public SchedulerFactoryBean schedulerFactoryBean(CronTrigger... triggers){
		SchedulerFactoryBean factoryBean = new SchedulerFactoryBean();
		//当triggers为null时,报异常
		factoryBean.setTriggers(triggers);
		return factoryBean;
	}

	@Component("quartzTask")
	public class QuartzTask{
		public void quartzTask() {
			DateFormatter df = new DateFormatter("yyyyMMdd HH:mm:ss");
			System.out.println("["+Thread.currentThread().getName()+"]执行任务,当前时间:"+df.print(new Date(), Locale.CHINA));
		}
	}
	
	
}

 

动态创建Quartz

首先,创建一个Job工厂,用于将Job实例注入到Job工厂中

package com.bcu.springboot.biz.quartz;

import org.qu
  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值