SpringBoot2.0项目模块整合之quartz动态配置定时任务

在我们日常的开发中,很多时候,定时任务都不是写死的,而是写到数据库中,从而实现定时任务的动态配置,下面就通过一个简单的示例,来实现这个功能。

添加依赖包

<!-- quartz -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-quartz</artifactId>
		</dependency>

 SchedulerConfig

package com.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.setStartupDelay(2);
	        schedulerFactoryBean.setAutoStartup(true);
	        schedulerFactoryBean.setOverwriteExistingJobs(true);
	}

}

application.yml配置

server:
    port: 8003

# 默认的profile为dev,其他环境通过指定启动参数使用不同的profile,比如:  
#   测试环境:java -jar quartz-service.jar --spring.profiles.active=test  
#   生产环境:java -jar quartz-service.jar --spring.profiles.active=prod  
spring: 
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource   #这里是配置druid连接池,以下都是druid的配置信息
    url: jdbc:mysql://127.0.0.1:3306/quartz?useUnicode=true&characterEncoding=utf-8&useSSL=false
    driver-class-name: com.mysql.jdbc.Driver
    username: root
    password: 123456
  
  quartz:
    #相关属性配置
    properties:
      org:
        quartz:
          scheduler:
            instanceName: clusteredScheduler
            instanceId: AUTO
          jobStore:
            class: org.quartz.impl.jdbcjobstore.JobStoreTX
            driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate
            tablePrefix: QRTZ_
            isClustered: true
            clusterCheckinInterval: 10000
            useProperties: false
          threadPool:
            class: org.quartz.simpl.SimpleThreadPool
            threadCount: 10
            threadPriority: 5
            threadsInheritContextClassLoaderOfInitializingThread: true
    #数据库方式
    job-store-type: jdbc
      
mybatis-plus:
  mapper-locations: classpath*:/mapper/**Mapper.xml    #把xml文件放在com.XX.mapper.*中可能会出现找到的问题,这里把他放在resource下的mapper中
  typeAliasesPackage: com.quartz.domain         #这里是实体类的位置,#实体扫描,多个package用逗号或者分号分隔
  configuration:
    map-underscore-to-camel-case: true
    cache-enabled: false

logging:
  file: quartz-service.log
  level:
    com.paiye: debug     
    

JobController

package com.quartz.controller;

import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import com.quartz.BaseController;
import com.quartz.api.IJobAndTriggerService;
import com.quartz.util.PageUtil;
import com.quartz.util.ResponseEntity;

/**  
* @ClassName: JobController  
* @Description: TODO()  
* @author lixin([email protected])  
* @date 2018年8月15日 上午10:02:00  
* @version V1.0  
*/ 
@Controller
@RequestMapping(value = "/job")
public class JobController extends BaseController {
	@Autowired
	private IJobAndTriggerService jobAndTriggerService;

	private static Logger log = LoggerFactory.getLogger(JobController.class);

	@RequestMapping(value = "/datagrid", method = RequestMethod.POST)
	@ResponseBody
	public Map<String, Object> queryjob(PageUtil search, HttpServletRequest request,HttpServletResponse response) {
		log.debug("queryjob");
		setHeader(response);
		search.setParams(getParams(request));
		return jobAndTriggerService.getPageJob(search);
	}
	
	/**
	 * @Title: addJob
	 * @Description: TODO(添加Job)
	 * @param jobClassName
	 *            类名
	 * @param jobGroupName
	 *            组名
	 * @param cronExpression
	 *            表达式,如:0/5 * * * * ? (每隔5秒)
	 */
	@RequestMapping(value = "/add", method = RequestMethod.POST)
	public @ResponseBody ResponseEntity addJob(
			@RequestParam(value = "jobClassName") String jobClassName, 
			@RequestParam(value = "jobGroupName") String jobGroupName, 
			@RequestParam(value = "cronExpression") String cronExpression,
			HttpServletResponse response){
		try {
			setHeader(response);
			jobAndTriggerService.addJob(jobClassName, jobGroupName, cronExpression);
			return ResponseEntity.SUCCESS();
		} catch (Exception e) {
			e.printStackTrace();
			return ResponseEntity.FAILURE(e.getMessage());
		}
	}

	/**
	 * @Title: pauseJob
	 * @Description: TODO(暂停Job)
	 * @param jobClassName
	 *            类名
	 * @param jobGroupName
	 *            组名
	 */
	@RequestMapping(value = "/pause", method = RequestMethod.POST)
	public @ResponseBody ResponseEntity pauseJob(
			@RequestParam(value = "jobClassName") String jobClassName, 
			@RequestParam(value = "jobGroupName") String jobGroupName,
			HttpServletResponse response) {
		try {
			setHeader(response);
			jobAndTriggerService.pauseJob(jobClassName, jobGroupName);
			return ResponseEntity.SUCCESS();
		} catch (Exception e) {
			e.printStackTrace();
			return ResponseEntity.FAILURE(e.getMessage());
		}
	}

	/**
	 * @Title: resumeJob
	 * @Description: TODO(恢复Job)
	 * @param jobClassName
	 *            类名
	 * @param jobGroupName
	 *            组名
	 */
	@RequestMapping(value = "/resume", method = RequestMethod.POST)
	public @ResponseBody ResponseEntity resumeJob(
			@RequestParam(value = "jobClassName") String jobClassName, 
			@RequestParam(value = "jobGroupName") String jobGroupName,
			HttpServletResponse response) {
		try {
			setHeader(response);
			jobAndTriggerService.resumejob(jobClassName, jobGroupName);
			return ResponseEntity.SUCCESS();
		} catch (Exception e) {
			e.printStackTrace();
			return ResponseEntity.FAILURE(e.getMessage());
		}
	}

	/**
	 * @Title: rescheduleJob
	 * @Description: TODO(重新设置Job)
	 * @param jobClassName
	 *            类名
	 * @param jobGroupName
	 *            组名
	 * @param cronExpression
	 *            表达式
	 */
	@RequestMapping(value = "/reschedule", method = RequestMethod.POST)
	public @ResponseBody ResponseEntity rescheduleJob(
			@RequestParam(value = "jobClassName") String jobClassName, 
			@RequestParam(value = "jobGroupName") String jobGroupName, 
			@RequestParam(value = "cronExpression") String cronExpression,
			HttpServletResponse response) {
		try {
			setHeader(response);
			jobAndTriggerService.updateJob(jobClassName, jobGroupName, cronExpression);
			return ResponseEntity.SUCCESS();
		} catch (Exception e) {
			e.printStackTrace();
			return ResponseEntity.FAILURE(e.getMessage());
		}
	}

	/**
	 * @Title: deleteJob
	 * @Description: TODO(删除Job)
	 * @param jobClassName
	 *            类名
	 * @param jobGroupName
	 *            组名
	 * @param cronExpression
	 *            表达式
	 */
	@RequestMapping(value = "/del", method = RequestMethod.POST)
	public @ResponseBody ResponseEntity deleteJob(@RequestParam(value = "jobClassName") String jobClassName, @RequestParam(value = "jobGroupName") String jobGroupName,
			HttpServletResponse response) {
		try {
			setHeader(response);
			jobAndTriggerService.deleteJob(jobClassName, jobGroupName);
			return ResponseEntity.SUCCESS();
		} catch (Exception e) {
			e.printStackTrace();
			return ResponseEntity.FAILURE(e.getMessage());
		}
	}

	
	/*@PostMapping(value = "/addjob")
	public void addjob(@RequestParam(value = "jobClassName") String jobClassName,
			@RequestParam(value = "jobGroupName") String jobGroupName,
			@RequestParam(value = "cronExpression") String cronExpression) throws Exception {
			jobAndTriggerService.addJob(jobClassName, jobGroupName, cronExpression);
	}

	@PostMapping(value = "/pausejob")
	public void pausejob(@RequestParam(value = "jobClassName") String jobClassName,
			@RequestParam(value = "jobGroupName") String jobGroupName) throws Exception {
		jobAndTriggerService.pauseJob(jobClassName, jobGroupName);
	}

	@PostMapping(value = "/resumejob")
	public void resumejob(@RequestParam(value = "jobClassName") String jobClassName,
			@RequestParam(value = "jobGroupName") String jobGroupName) throws Exception {
		jobAndTriggerService.resumejob(jobClassName, jobGroupName);
	}

	@PostMapping(value = "/reschedulejob")
	public void rescheduleJob(@RequestParam(value = "jobClassName") String jobClassName,
			@RequestParam(value = "jobGroupName") String jobGroupName,
			@RequestParam(value = "cronExpression") String cronExpression) throws Exception {
		jobAndTriggerService.updateJob(jobClassName, jobGroupName, cronExpression);
	}

	@PostMapping(value = "/deletejob")
	public void deletejob(@RequestParam(value = "jobClassName") String jobClassName,
			@RequestParam(value = "jobGroupName") String jobGroupName) throws Exception {
		jobAndTriggerService.deleteJob(jobClassName, jobGroupName);
	}
*/

}

JobAndTriggerImpl

package com.quartz.service.impl;

import java.util.List;
import java.util.Map;

import org.quartz.CronScheduleBuilder;
import org.quartz.CronTrigger;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.JobKey;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.TriggerBuilder;
import org.quartz.TriggerKey;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.baomidou.mybatisplus.plugins.Page;
import com.baomidou.mybatisplus.plugins.pagination.Pagination;
import com.quartz.api.IJobAndTriggerService;
import com.quartz.dto.JobAndTriggerDto;
import com.quartz.job.BaseJob;
import com.quartz.mapper.JobAndTriggerMapper;
import com.quartz.util.PageUtil;

/**  
* @ClassName: JobAndTriggerImpl  
* @Description: TODO()  
* @author lixin([email protected])  
* @date 2018年3月15日 上午10:03:00  
* @version V1.0  
*/ 
@Service
public class JobAndTriggerImpl implements IJobAndTriggerService {
	
	@Autowired
	private Scheduler scheduler;
	
	
	@Autowired
	// 加入Qulifier注解,通过名称注入bean
	//	@Qualifier("Scheduler")
	private JobAndTriggerMapper jobAndTriggerMapper;
	

	public Map<String, Object> getPageJob(PageUtil search) {
		Pagination page = new Page<Object>(search.getPage(), search.getRows(), search.getSort());
		List<JobAndTriggerDto> records = jobAndTriggerMapper.getJobAndTriggerDetails(page);
		return search.getResultMap(page.getTotal(), records);
	}

	@Override
	public JobAndTriggerDto getPageJobmod() {
		return jobAndTriggerMapper.getJobAndTriggerDto();
	}

	@Override
	public void addJob(String jobClassName, String jobGroupName, String cronExpression) throws Exception {
		// 启动调度器
				scheduler.start();

				// 构建job信息
				JobDetail jobDetail = JobBuilder.newJob(getClass(jobClassName).getClass())
						.withIdentity(jobClassName, jobGroupName).build();

				// 表达式调度构建器(即任务执行的时间)
				CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cronExpression);

				// 按新的cronExpression表达式构建一个新的trigger
				CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(jobClassName, jobGroupName)
						.withSchedule(scheduleBuilder).build();

				try {
					scheduler.scheduleJob(jobDetail, trigger);
					System.out.println("创建定时任务成功");

				} catch (SchedulerException e) {
					System.out.println("创建定时任务失败" + e);
					throw new Exception("创建定时任务失败");
				}
		
	}

	@Override
	public void updateJob(String jobClassName, String jobGroupName, String cronExpression) throws Exception {
		try {
			TriggerKey triggerKey = TriggerKey.triggerKey(jobClassName, jobGroupName);
			// 表达式调度构建器
			CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cronExpression);

			CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);

			// 按新的cronExpression表达式重新构建trigger
			trigger = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder).build();

			// 按新的trigger重新设置job执行
			scheduler.rescheduleJob(triggerKey, trigger);
		} catch (SchedulerException e) {
			System.out.println("更新定时任务失败" + e);
			throw new Exception("更新定时任务失败");
		}
	}

	@Override
	public void deleteJob(String jobClassName, String jobGroupName) throws Exception {
		scheduler.pauseTrigger(TriggerKey.triggerKey(jobClassName, jobGroupName));
		scheduler.unscheduleJob(TriggerKey.triggerKey(jobClassName, jobGroupName));
		scheduler.deleteJob(JobKey.jobKey(jobClassName, jobGroupName));
	}

	@Override
	public void pauseJob(String jobClassName, String jobGroupName) throws Exception {
		scheduler.pauseJob(JobKey.jobKey(jobClassName, jobGroupName));
	}

	@Override
	public void resumejob(String jobClassName, String jobGroupName) throws Exception {
		scheduler.resumeJob(JobKey.jobKey(jobClassName, jobGroupName));
	}
	
	public static BaseJob getClass(String classname) throws Exception {
		Class<?> class1 = Class.forName(classname);
		return (BaseJob) class1.newInstance();
	}
	
}

Github项目地址:项目demo下载

项目效果:

如有问题请留言

猜你喜欢

转载自blog.csdn.net/lx1309244704/article/details/81810373