springboot整合quartz定时任务并持久化到数据库

springboot整合定时任务quartz
1、定时任务的的相关方法:

package org.springeos.modules.quartz.service.impl;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.extern.slf4j.Slf4j;
import org.quartz.*;
import org.springeos.core.tool.api.R;
import org.springeos.modules.quartz.mapper.QuartzMapper;
import org.springeos.modules.quartz.service.QuartzService;
import org.springeos.modules.quartz.vo.QuartzVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;


@Slf4j
@Service
public class QuartzServiceImpl implements QuartzService {

	@Autowired
	private Scheduler scheduler;
	@Autowired
	private QuartzMapper quartzMapper;

	@Override
	public R addJob(String jobClassName, String jobName, String groupName, String cronExpression) {
		R<Object> r = new R<>();
		try {
			//构建job信息
			JobDetail jobDetail =
				JobBuilder.newJob((Class<? extends Job>)Class.forName(jobClassName))
					.withIdentity(jobName, groupName)
					.build();
			//表达式调度构建器(即任务执行的时间)
			CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cronExpression);
			//按新的cronExpression表达式构建一个新的trigger
			CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(jobName, groupName)
				.startNow().withSchedule(scheduleBuilder).build();
			scheduler.scheduleJob(jobDetail, trigger);
			// 启动调度器
			scheduler.start();
			log.info("创建定时任务成功!");
			r.setSuccess(true);
			r.setMsg("创建定时任务成功!");
		} catch (SchedulerException | ClassNotFoundException e) {
			log.error("创建定时任务失败"+e);
			r.setMsg("创建定时任务失败!");
			r.setSuccess(false);
		}finally {
			return r;
		}
	}

	@Override
	public R pauseJob(String jobName, String jobGroupName) {
		R<Object> r = new R<>();
		try {
			scheduler.pauseJob(JobKey.jobKey(jobName, jobGroupName));
			log.info("暂停定时任务成功!");
			r.setSuccess(true);
			r.setMsg("暂停定时任务成功!");
		} catch (SchedulerException e) {
			log.error("暂停定时任务失败"+e);
			e.printStackTrace();
			r.setSuccess(false);
			r.setMsg("暂停定时任务失败!");
		}finally {
			return r;
		}
	}

	@Override
	public R resumeJob(String jobName, String jobGroupName) {
		R<Object> r = new R<>();
		try {
			scheduler.resumeJob(JobKey.jobKey(jobName, jobGroupName));
			r.setSuccess(true);
			r.setMsg("恢复定时任务成功!");
		} catch (SchedulerException e) {
			log.error("恢复定时任务失败"+e);
			e.printStackTrace();
			r.setSuccess(true);
			r.setMsg("恢复定时任务失败!");
		}finally {
			return r;
		}
	}

	@Override
	public R rescheduleJob(String jobName, String triggerGroupName, String cronExpression) {
		R<Object> r = new R<>();
		try {
			TriggerKey triggerKey = TriggerKey.triggerKey(jobName, triggerGroupName);
			// 表达式调度构建器
			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);
			r.setSuccess(true);
			r.setMsg("更新定时任务成功!");;
		} catch (SchedulerException e) {
			log.error("更新定时任务失败"+e);
			r.setSuccess(true);
			r.setMsg("更新定时任务失败!");
		}finally {
			return r;
		}
	}

	@Override
	public R deleteJob(String jobName, String jobGroupName) {
		R<Object> r = new R<>();
		try {
			scheduler.pauseTrigger(TriggerKey.triggerKey(jobName, jobGroupName));
			scheduler.unscheduleJob(TriggerKey.triggerKey(jobName, jobGroupName));
			scheduler.deleteJob(JobKey.jobKey(jobName, jobGroupName));
			r.setSuccess(true);
			r.setMsg("删除定时任务成功!");
		} catch (SchedulerException e) {
			log.error("删除定时任务失败"+e);
			e.printStackTrace();
			r.setSuccess(true);
			r.setMsg("删除定时任务失败!");
		}finally {
			return r;
		}
	}


	@Override
	public boolean checkExists(String jobName, String jobGroupName) {
		try {
			JobDetail jobDetail = scheduler.getJobDetail(new JobKey(jobName, jobGroupName));
			return jobDetail!=null;
		} catch (SchedulerException e) {
			log.error("根据jobName和groupName检查job是否存在失败"+e);
			e.printStackTrace();
		}
		return false;
	}

	@Override
	public IPage<QuartzVO> pageJob(Page page) {
		List<QuartzVO> pageJob = quartzMapper.pageJob(page);
		return page.setRecords(pageJob);
	}

}

2、需要的依赖:

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

3、配置文件:
表11张,第一次启动的时候配置initialize-schema: never会自动生成表,然后改成never即可,否则后续还会初始化表,删掉原来的数据
表:
在这里插入图片描述

#数据源配置
spring:
  #  redis:
  #    ##redis 单机环境配置
  #    host: xxx
  #    port: 6379
  #    password: xxx
  #    database: 0
  #    ssl: false
  datasource:
    # Oracle
    url: xxx
    username: xx
    password: xx
  quartz:
    jdbc:
      #  初始化Quartz表结构,项目第一次启动配置程always,然后改成never 否则已生成的job会被初始化掉
      initialize-schema: never
    #   作业存储类型
    job-store-type: jdbc
    #   调度程序的名称
    scheduler-name: hrCleanScheduler
    properties:
      org:
        quartz:
          scheduler:
            instanceName: etlCleanScheduler
            instanceId: AUTO
          jobStore:
            #数据保存方式为持久化
            class: org.quartz.impl.jdbcjobstore.JobStoreTX
            driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate
            #Quartz表前缀
            tablePrefix: QRTZ_
            #是否加入集群
            isClustered: false
            clusterCheckinInterval: 10000
            useProperties: false
          #            调度器线程池配置
          threadPool:
            class: org.quartz.simpl.SimpleThreadPool
            #线程数
            threadCount: 20
            #线程优先级
            threadPriority: 5
            threadsInheritContextClassLoaderOfInitializingThread: true

4、自己写一个controller,service来方便接口调用,,自己写的分页方法,
controller:

package org.springeos.modules.quartz.controller;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springeos.core.launch.constant.AppConstant;
import org.springeos.core.tool.api.R;
import org.springeos.modules.quartz.service.QuartzService;
import org.springeos.modules.quartz.vo.QuartzVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

/**
 * 关于job的管理
 *
 * @author wangk
 * @date 2019-08-13
 */
@Slf4j
@Api(value = "关于job的管理接口",tags = "定时任务接口")
@RestController
@RequestMapping(value = AppConstant.APPLICATION_SYSTEM_NAME+"/job")
public class  QuartzController{

	@Autowired
	private QuartzService jobService;


	@PostMapping(value = "/addJob")
	@ApiOperation(value = "添加job",notes = "jobClassName请使用类的全路径名" )
	public R addJob(
		@RequestParam(value = "jobClassName") String jobClassName,
		@RequestParam(value = "jobName") String jobName,
		@RequestParam(value = "jobGroupName") String jobGroupName,
		@RequestParam(value = "cronExpression") String cronExpression) {
		log.info("添加job---jobName:"+jobName+"---jobGroupName:"+jobGroupName);
		return jobService.addJob(jobClassName, jobName, jobGroupName, cronExpression);
	}

	@PostMapping(value="/pauseJob")
	@ApiOperation(value = "暂停job")
	public R pauseJob(
		@RequestParam(value="jobName")String jobName,
		@RequestParam(value="jobGroupName")String jobGroupName){
		log.info("暂停job---jobName:"+jobName+"---jobGroupName:"+jobGroupName);
		return jobService.pauseJob(jobName, jobGroupName);
	}

	@PostMapping(value="/resumeJob")
	@ApiOperation(value = "恢复job")
	public R resumeJob(
		@RequestParam(value="jobName")String jobName,
		@RequestParam(value="jobGroupName")String jobGroupName){
		log.info("恢复job---jobName:"+jobName+"---jobGroupName:"+jobGroupName);
		return jobService.resumeJob(jobName, jobGroupName);
	}

	@PostMapping(value="/rescheduleJob")
	@ApiOperation(value = "更新job")
	public R rescheduleJob(
		@RequestParam(value="jobName")String jobName,
		@RequestParam(value="triggerGroupName")String triggerGroupName,
		@RequestParam(value="cronExpression")String cronExpression){
		log.info("更新job---jobName:"+jobName);
		return jobService.rescheduleJob(jobName, triggerGroupName,cronExpression);
	}

	@PostMapping(value = "/deleteJob")
	@ApiOperation(value = "删除job")
	public R deleteJob(
		@RequestParam(value = "jobName") String jobName,
		@RequestParam(value = "jobGroupName") String jobGroupName) {
		log.info("删除job---jobName:"+jobName+"---jobGroupName:"+jobGroupName);
		return jobService.deleteJob(jobName, jobGroupName);
	}

	//分页查询
	@PostMapping("/page")
	@ApiOperation(value = "分页查询")
	public R<IPage<QuartzVO>> pageJob(Page page) {
		log.info("分页查询");
		IPage<QuartzVO> result = jobService.pageJob(page);
		return R.data(result);
	}

}

service:

package org.springeos.modules.quartz.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springeos.core.tool.api.R;
import org.springeos.modules.quartz.vo.QuartzVO;

public interface QuartzService{

	R addJob(String jobClassName, String jobName, String groupName, String cronExpression);

	R pauseJob(String jobName, String jobGroupName);

	R resumeJob(String jobName, String jobGroupName);

	R rescheduleJob(String jobName, String triggerGroupName, String cronExpression);

	R deleteJob(String jobName, String jobGroupName);

	boolean checkExists(String jobName, String jobGroupName);

	IPage<QuartzVO> pageJob(Page page);

}

mapper:

package org.springeos.modules.quartz.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Select;
import org.springeos.modules.quartz.vo.QuartzVO;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
public interface QuartzMapper extends BaseMapper<QuartzVO> {

	@Select("SELECT DISTINCT j.JOB_NAME AS jobName, j.JOB_GROUP AS jobGroupName, j.JOB_CLASS_NAME AS jobClassName, c.CRON_EXPRESSION AS cronExpression, q.TRIGGER_STATE AS triggerState, q.TRIGGER_NAME AS triggerName, q.TRIGGER_GROUP AS triggerGroup FROM QRTZ_JOB_DETAILS j INNER JOIN QRTZ_CRON_TRIGGERS c ON j.JOB_NAME = c.TRIGGER_NAME INNER JOIN QRTZ_TRIGGERS q ON j.JOB_NAME = q.JOB_NAME")
	List<QuartzVO> pageJob(Page page);
}

5、测试job:

package org.springeos.modules.quartz.job;


import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;

public class HelloJob extends QuartzJobBean {

	@Override
	protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
		System.err.println("定时任务正在执行----------------------------------");
	}
}

postman调用新增定时任务的接口:
任务名和组名可以任意写,配置好任务类所在的路径和定时表达式,访问即可
http://localhost:80/eos-system/job/addJob

在这里插入图片描述
通过控制台发现定时任务可发现定时任务可以正常执行
在这里插入图片描述
去表中查看,QRTZ_JOB_DETAILS表中已经插入数据
在这里插入图片描述
corn触发器表中也正常插入数据
在这里插入图片描述

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值