Springboot集成quartz

项目中要用到定时任务,所以结合以前的项目和网上的找的东西,整合到了项目中,测试可用

首先是添加的jar包依赖

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
使用的SpringBoot版本是2.1.3.RELEASE

然后是一些相关的配置文件

# quartz config
spring.quartz.properties.org.quartz.scheduler.instanceName=clusteredScheduler
spring.quartz.properties.org.quartz.scheduler.id=AUTO
#spring.quartz.properties.org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTX
#spring.quartz.properties.org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate
#spring.quartz.properties.org.quartz.jobStore.tablePrefix=QRTZ_
#spring.quartz.properties.org.quartz.jobStore.isClustered=true
#spring.quartz.properties.org.quartz.jobStore.clusterCheckinInterval=10000
#spring.quartz.properties.org.quartz.jobStore.useProperties=false
spring.quartz.properties.org.quartz.threadPool.class=org.quartz.simpl.SimpleThreadPool
spring.quartz.properties.org.quartz.threadPool.threadCount=10
spring.quartz.properties.org.quartz.threadPool.threadPriority=5
spring.quartz.properties.org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread=true
#spring.quartz.job-store-type=jdbc

 因为使用的是SpringBoot的项目,去除掉了xml,所以有一些java Config的配置类

package com.voole.config.quartz;

import org.quartz.spi.TriggerFiredBundle;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
import org.springframework.scheduling.quartz.AdaptableJobFactory;
import org.springframework.stereotype.Component;

@Component
public class VooleJobFactory extends AdaptableJobFactory{

	@Autowired
	private AutowireCapableBeanFactory capableBeanFactory;

	@Override
	protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
		Object jobInstance = super.createJobInstance(bundle);
		capableBeanFactory.autowireBean(jobInstance);
		return jobInstance;
	}
	
	
}

  

package com.voole.config.quartz;


import org.springframework.boot.autoconfigure.quartz.SchedulerFactoryBeanCustomizer;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;

@Configuration
public class SchedulerConfig implements SchedulerFactoryBeanCustomizer {

	@Override
	public void customize(SchedulerFactoryBean schedulerFactoryBean) {
		schedulerFactoryBean.setAutoStartup(true);
		schedulerFactoryBean.setOverwriteExistingJobs(true);
	}

}

  

package com.voole.config.quartz;

import org.quartz.Scheduler;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;

@Configuration
public class QuartzConfigration {

	@Autowired
	private VooleJobFactory vooleJobFactory;
	
	@Bean
	public SchedulerFactoryBean schedulerFactoryBean() {
		SchedulerFactoryBean bean = new SchedulerFactoryBean();
		bean.setJobFactory(vooleJobFactory);
		return bean;
	}
	
	@Bean(name="scheduler")
	public Scheduler scheduler() {
		return	schedulerFactoryBean().getScheduler();
	}
}

  因为想在任务类中添加Spring的注入特性,所以上面的有些配置是做的依赖注入相关的配置信息

接着是提供的对外暴露的方法

package com.voole.platform.task;

import java.util.Map;

public class ScheduleJob {

	public static final int TASK_MODEL_NOW = 0;// 立即执行
	public static final int TASK_MODEL_TIME = 1;// 定时执行
	public static final int TASK_MODEL_CRON = 2;//循环执行

	public static final int TASK_STATUS_DO = 0;// 任务未处理
	public static final int TASK_STATUS_SUCC = 1; // 任务成功
	public static final int TASK_STATUS_FAIL = 2;// // 任务执行完成存在错误
	public static final int TASK_STATUS_DOING = 3;// 任务正在执行
	public static final int TASK_STATUS_DISCARD = 4;// 任务废弃
	
    public static final int RECORD_STATUS_DO = 0;//任务未处理
    public static final int RECORD_STATUS_SUCC = 1; //任务成功
    public static final int RECORD_STATUS_FAIL = 2;//任务失败

	private Long id;
	private String taskType;
	private int taskModel;
	private String cron;
	private int status;
	private String taskClass;
	
	private Map<String,String> data;
	

	

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public String getTaskType() {
		return taskType;
	}

	public void setTaskType(String taskType) {
		this.taskType = taskType;
	}

	public int getTaskModel() {
		return taskModel;
	}

	public void setTaskModel(int taskModel) {
		this.taskModel = taskModel;
	}

	

	public String getCron() {
		return cron;
	}

	public void setCron(String cron) {
		this.cron = cron;
	}


	public int getStatus() {
		return status;
	}

	public void setStatus(int status) {
		this.status = status;
	}

	public String getTaskClass() {
		return taskClass;
	}

	public void setTaskClass(String taskClass) {
		this.taskClass = taskClass;
	}

	

	public Map<String, String> getData() {
		return data;
	}

	public void setData(Map<String, String> data) {
		this.data = data;
	}
	
	
}

  

package com.voole.platform.task;


import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Map;

import javax.annotation.PostConstruct;

import org.quartz.CronScheduleBuilder;
import org.quartz.CronTrigger;
import org.quartz.Job;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.JobKey;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SimpleTrigger;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.TriggerKey;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;




@Service
public class JobTaskService {
	
	private final static Logger logger = LoggerFactory.getLogger(JobTaskService.class);
	
	//默认任务组名
	public static final String DEFAULT_JOB_GROUP_NAME = "DEFAULT_JOBGROUP";
	public static final String DEFAULT_TRIGGER_GROUP_NAME = "DEFAULT_TRIGGERGROUP";
	
	@Autowired
	private Scheduler scheduler;
	
	
	/**
	 * 
	 * <p>Title: addJob</p>
	 * <p>Description: 添加任务</p>
	 * @param job
	 * @param jobName
	 * @throws Exception
	 * @author 冯浩  2018年11月6日 下午3:55:13
	 */
	public void addJob(ScheduleJob job,String jobName) throws Exception{
		if(job == null) {
			return;
		}
		
		SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		
		if(!scheduler.isStarted()) {
			//notify all scheduler listeners
			scheduler.start();
		}
		JobDetail jobDetail = scheduler.getJobDetail(JobKey.jobKey(jobName, DEFAULT_JOB_GROUP_NAME));
		if(jobDetail == null) {
			Class clazz = Class.forName(job.getTaskClass());
			jobDetail = JobBuilder.newJob(getClass(clazz).getClass()).withIdentity(jobName, DEFAULT_JOB_GROUP_NAME).build();
			jobDetail.getJobDataMap().putAll(job.getData());
			
			int taskModel = job.getTaskModel();
			Trigger trigger = null;
			if (taskModel == ScheduleJob.TASK_MODEL_TIME) {
				Date startDate = dateFormat.parse(job.getCron() == null ? dateFormat.format(new Date()) : job.getCron());
				trigger = (SimpleTrigger)TriggerBuilder.newTrigger().withIdentity(jobName, DEFAULT_JOB_GROUP_NAME).startAt(startDate).build();
			} else if(taskModel == ScheduleJob.TASK_MODEL_NOW){
				trigger = (SimpleTrigger)TriggerBuilder.newTrigger().withIdentity(jobName,DEFAULT_JOB_GROUP_NAME).startNow().build();
			} else if(taskModel == ScheduleJob.TASK_MODEL_CRON) {
				CronScheduleBuilder cronSchedule = CronScheduleBuilder.cronSchedule(job.getCron());
				trigger = (CronTrigger)TriggerBuilder.newTrigger().withIdentity(jobName,DEFAULT_JOB_GROUP_NAME).withSchedule(cronSchedule).build();
			}
			scheduler.scheduleJob(jobDetail, trigger);
			
		}
	}
	
	public void addJob(ScheduleJob job) throws Exception {
		if (job == null) {
			return;
		}
		String jobName = job.getTaskType() + job.getId();
		addJob(job, jobName);
	}
	
	/**
	 * 移除一个任务(使用默认的任务组名,触发器名,触发器组名)
	 */
	public void removeJob(String jobClassName,String jobGroupName) {
		try {
			scheduler.pauseTrigger(TriggerKey.triggerKey(jobClassName, jobGroupName));
			scheduler.unscheduleJob(TriggerKey.triggerKey(jobClassName, jobGroupName));
			scheduler.deleteJob(JobKey.jobKey(jobClassName, jobGroupName));
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}
	
	
	/**
	 * 移除一个任务同时修改cron_task状态
	 * @param jobName
	 * @param triggerName
	 * @author
	 * @time   2016-11-24
	 */
	public void clearJob(String jobName,String triggerName){
		try {
			JobDetail jobDetail = scheduler.getJobDetail(JobKey.jobKey(jobName, DEFAULT_JOB_GROUP_NAME));
			if(jobDetail == null){
				return;
			}
			removeJob(jobName,triggerName);
		} catch (SchedulerException e) {
			e.printStackTrace();
		}
	}
	

	public Job getClass(@SuppressWarnings("rawtypes") Class clazz) throws Exception {
		return (Job)clazz.newInstance();
	}
	
	

}

  然后是测试任务

package com.voole.platform.task.job;

import org.quartz.Job;
import org.quartz.JobDataMap;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.stereotype.Service;

@Service
public class IndexJob implements Job {

    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        JobDataMap jobDataMap = context.getJobDetail().getJobDataMap();
        Object orderid = jobDataMap.get("orderid");
        System.out.println(orderid);
    }

}

最后是测试类,做的是使用controller做的任务触发

@ApiOperation(value="定时任务测试")
    @GetMapping("quartz")
    public String quartz() throws Exception {
        Map<String,String> data = new HashMap<>();
        data.put("orderid", "123456789");
        ScheduleJob job = new ScheduleJob();
        job.setId(1l);
        job.setTaskType("order");
        job.setTaskClass("com.voole.platform.task.job.IndexJob");
        job.setTaskModel(ScheduleJob.TASK_MODEL_CRON);
        Date addMinutes = DateUtils.addMinutes(1);
        String format = DateUtils.format(addMinutes);
        job.setCron("1/2 * * * * ?");
        job.setData(data);
        taskService.addJob(job);
        return "Sucess";
    }

打完了!

 

原文地址:https://www.cnblogs.com/nihaofenghao/p/10494540.html