springboot整合quartz定時任務框架的完整步驟
Spring整合Quartz
- 添加maven配置。
- 相關配置文件(不管是properties 還是yml。采用JDBC存儲)。
- 創(chuàng)建quartz使用的數據表。
- 業(yè)務邏輯層中使用。
- 數據表
- 具體使用
pom文件
如下所示:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
對應的properties 文件
放在resource目錄下
# =========================================================================== # Configure Main Scheduler Properties 調度器屬性 # =========================================================================== #調度標識名 集群中每一個實例都必須使用相同的名稱 org.quartz.scheduler.instanceName = DefaultQuartzScheduler #ID設置為自動獲取 每一個必須不同 org.quartz.scheduler.instanceId = AUTO #============================================================================ # Configure ThreadPool #============================================================================ #線程池的實現類(一般使用SimpleThreadPool即可滿足幾乎所有用戶的需求) org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool #指定線程數,至少為1(無默認值)(一般設置為1-100直接的整數合適) org.quartz.threadPool.threadCount = 25 #設置線程的優(yōu)先級(最大為java.lang.Thread.MAX_PRIORITY 10,最小為Thread.MIN_PRIORITY 1,默認為5) org.quartz.threadPool.threadPriority = 5 #============================================================================ # Configure JobStore #============================================================================ # 觸發(fā)失敗閾值,未超過觸發(fā)時間60s則直接觸發(fā),若超過則失火,log信息Handling 1 trigger(s) that missed their scheduled fire-time. org.quartz.jobStore.misfireThreshold = 60000 #數據保存方式為數據庫持久化 org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX #數據庫代理類,一般org.quartz.impl.jdbcjobstore.StdJDBCDelegate可以滿足大部分數據庫 org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate #JobDataMaps是否都為String類型 org.quartz.jobStore.useProperties = false #表的前綴,默認QRTZ_ org.quartz.jobStore.tablePrefix = QRTZ_ #是否加入集群 org.quartz.jobStore.isClustered = true #調度實例失效的檢查時間間隔 org.quartz.jobStore.clusterCheckinInterval = 20000
配置類
package com.anjie.manage.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.core.io.ClassPathResource;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;
import org.springframework.scheduling.quartz.SpringBeanJobFactory;
import org.springframework.transaction.PlatformTransactionManager;
import javax.sql.DataSource;
import java.io.IOException;
@Configuration
public class QuartzConfig {
@Autowired
private DataSource dataSource;
@Autowired
private PlatformTransactionManager txManager;
@Bean(name = "quartzScheduler")
public SchedulerFactoryBean quartzScheduler() throws IOException {
//創(chuàng)建SchedulerFactoryBean
SchedulerFactoryBean factory = new SchedulerFactoryBean();
//設置調度器自動運行
factory.setAutoStartup(true);
//設置配置文件位置
factory.setConfigLocation(new ClassPathResource("/quartz.properties"));
//設置job工廠,使job可以自動注入
SpringBeanJobFactory jobFactory = new SpringBeanJobFactory();
factory.setJobFactory(jobFactory);
//設置數據源
factory.setDataSource(dataSource);
//設置事務
factory.setTransactionManager(txManager);
//設置重寫已存在的Job
factory.setOverwriteExistingJobs(true);
return factory;
}
@Bean(name = "scheduler")
public Scheduler scheduler() throws IOException {
return quartzScheduler().getScheduler();
}
}
自定義任務類:ScheduledTask
package com.anjie.manage.quartz;
import com.anjie.auth.common.exception.BadConfigurationException;
import com.anjie.manage.common.SpringContextUtil;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.springframework.context.ApplicationContext;
import java.lang.reflect.Method;
@Slf4j
@Setter
public class ScheduledTask implements Job {
private Integer id;
private String params;
private String serviceBeanName;
private String methodName;
@Override
public void execute(JobExecutionContext jobExecutionContext) {
try {
//使用反射執(zhí)行spring中的任務
ApplicationContext wac = SpringContextUtil.getApplicationContext();
Class<?> serviceBean = wac.getBean(serviceBeanName).getClass();
if (StringUtils.isNotEmpty(params)){
Method method = serviceBean.getDeclaredMethod(methodName,String.class);
method.invoke(wac.getBean(serviceBean),params);
}else {
Method method = serviceBean.getDeclaredMethod(methodName,null);
method.invoke(wac.getBean(serviceBean),null);
}
}catch (Exception e){
throw new BadConfigurationException("任務執(zhí)行失敗");
}
}
}
獲取spring中bean的工具類:SpringContextUtil
package com.anjie.manage.common;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
@Component
public class SpringContextUtil implements ApplicationContextAware {
private static ApplicationContext applicationContext = null;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
SpringContextUtil.applicationContext = applicationContext;
}
/**
* 獲取applicationContext
* @return
*/
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
}
定時任務服務接口:QuartzService
package com.anjie.manage.quartz.service;
import com.anjie.manage.quartz.entity.po.QuartzTask;
import java.util.List;
public interface QuartzService {
void initAllTask(List<QuartzTask> scheduledTaskBeanList) throws Exception;
void addJob(QuartzTask scheduledTask);
void updateJob(QuartzTask quartzTask);
void deleteJob(QuartzTask quartzTask);
void runJobOnce(QuartzTask quartzTask);
}
QuartzService實現類:QuartzServiceImpl
package com.anjie.manage.quartz.service.impl;
import com.anjie.manage.quartz.entity.po.QuartzTask;
import com.anjie.manage.quartz.ScheduledTask;
import com.anjie.manage.quartz.service.QuartzService;
import lombok.extern.slf4j.Slf4j;
import org.quartz.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.util.*;
@Service
@Slf4j
public class QuartzServiceImpl implements QuartzService {
@Autowired
private Scheduler scheduler;
@Override
public void initAllTask(List<QuartzTask> quartzTaskList) throws Exception {
log.info("程序啟動 ==> 初始化所有任務開始 !");
if (CollectionUtils.isEmpty(quartzTaskList)) {
scheduler.shutdown();
return;
}
for (QuartzTask quartzTask : quartzTaskList) {
//判斷是否啟動狀態(tài)
if (quartzTask.getStatus()) {
this.addJob(quartzTask);
}
}
log.info("程序啟動 ==> 初始化所有任務結束 !");
}
@Override
public void addJob(QuartzTask quartzTask) {
String taskName = quartzTask.getTaskName();
String groupName = quartzTask.getGroupName();
String cron = quartzTask.getCron();
TriggerKey triggerKey = TriggerKey.triggerKey(taskName, groupName);
try {
boolean result = scheduler.checkExists(triggerKey);
//job已存在,直接返回
log.info("checkExists quartTask = {} , result = {}", quartzTask, result);
if (result) {
return;
}
Job job = new ScheduledTask();
//構建job信息
JobDetail jobDetail = JobBuilder.newJob(job.getClass()).withIdentity(taskName, groupName).build();
//表達式調度構建器(即任務執(zhí)行的時間)
/*使用withMisfireHandlingInstructionDoNothing是因為重啟項目時之前添加的job都算失火
,默認配置withMisfireHandlingInstructionFireAndProceed失火后會立即執(zhí)行一遍,
而withMisfireHandlingInstructionDoNothing失火后不會立即執(zhí)行,而是按照下一個cron執(zhí)行
*/
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cron).withMisfireHandlingInstructionDoNothing();
//按新的cronExpression表達式構建一個新的trigger
CronTrigger trigger = TriggerBuilder.newTrigger().startNow().withIdentity(taskName, groupName).withSchedule(scheduleBuilder).build();
String[] serviceBean = quartzTask.getJobClass().split("\\.");
//獲得JobDataMap,寫入數據
Map<String, Object> paramMap = new HashMap<>();
paramMap.put("id", quartzTask.getId());
paramMap.put("params", quartzTask.getParams());
paramMap.put("methodName",serviceBean[1]);
paramMap.put("serviceBeanName",serviceBean[0]);
trigger.getJobDataMap().putAll(paramMap);
scheduler.scheduleJob(jobDetail, trigger);
log.info("addJob quartTask = {} is success", quartzTask);
} catch (Exception e) {
log.error("addJob quartTask = {} is fail, msg = {}", quartzTask, e);
}
}
@Override
public void updateJob(QuartzTask quartzTask) {
String taskName = quartzTask.getTaskName();
String groupName = quartzTask.getGroupName();
String cron = quartzTask.getCron();
TriggerKey triggerKey = TriggerKey.triggerKey(taskName, groupName);
try {
CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
if (cron != null) {
// 表達式調度構建器
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cron).withMisfireHandlingInstructionDoNothing();
// 按新的cronExpression表達式重新構建trigger
trigger = trigger.getTriggerBuilder().startNow().withIdentity(triggerKey).withSchedule(scheduleBuilder).build();
}
String[] serviceBean = quartzTask.getJobClass().split("\\.");
//獲得JobDataMap,寫入數據
Map<String, Object> paramMap = new HashMap<>();
paramMap.put("id", quartzTask.getId());
paramMap.put("params", quartzTask.getParams());
paramMap.put("serviceBeanName",serviceBean[0]);
paramMap.put("methodName",serviceBean[1]);
trigger.getJobDataMap().putAll(paramMap);
// 按新的trigger重新設置job執(zhí)行
scheduler.rescheduleJob(triggerKey, trigger);
log.info("updateJob quartTask = {} is success", quartzTask);
} catch (SchedulerException e) {
log.error("updateJob quartTask = {} is fail, msg = {}", quartzTask, e);
}
}
@Override
public void deleteJob(QuartzTask quartzTask) {
String taskName = quartzTask.getTaskName();
String groupName = quartzTask.getGroupName();
try {
scheduler.pauseTrigger(TriggerKey.triggerKey(taskName, groupName));
scheduler.unscheduleJob(TriggerKey.triggerKey(taskName, groupName));
scheduler.deleteJob(JobKey.jobKey(taskName, groupName));
log.info("deleteJob quartTask = {} is success", quartzTask);
} catch (SchedulerException e) {
log.error("deleteJob quartTask = {} is fail, msg = {}", quartzTask, e);
}
}
@Override
public void runJobOnce(QuartzTask quartzTask){
String taskName = UUID.randomUUID().toString();
String groupName = UUID.randomUUID().toString();
try {
// Class<?> aClass = Class.forName(quartzTask.getJobClass());
Job job = new ScheduledTask();
//構建job信息
JobDetail jobDetail = JobBuilder.newJob(job.getClass()).withIdentity(taskName, groupName).build();
SimpleTrigger simpleTrigger = TriggerBuilder.newTrigger()
.withIdentity(taskName, groupName)
.startAt(new Date())
.withSchedule(SimpleScheduleBuilder.simpleSchedule()
.withIntervalInSeconds(1)
.withRepeatCount(0))//重復執(zhí)行的次數,因為加入任務的時候馬上執(zhí)行了,所以不需要重復,否則會多一次。
.build();
String[] serviceBean = quartzTask.getJobClass().split("\\.");
//獲得JobDataMap,寫入數據
Map<String, Object> paramMap = new HashMap<>();
paramMap.put("id", quartzTask.getId());
paramMap.put("params", quartzTask.getParams());
paramMap.put("serviceBeanName",serviceBean[0]);
paramMap.put("methodName",serviceBean[1]);
simpleTrigger.getJobDataMap().putAll(paramMap);
scheduler.scheduleJob(jobDetail, simpleTrigger);
}catch (Exception e){
log.error("run job quartTask = {} is fail, msg = {}", quartzTask, e);
}
}
}
ScheduledTaskRunner類
項目啟動后獲取數據庫中的定時任務列表,初始化定時任務
package com.anjie.manage.quartz;
import com.anjie.manage.quartz.entity.po.QuartzTask;
import com.anjie.manage.quartz.service.QuartzService;
import com.anjie.manage.quartz.service.QuartzTaskService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import java.util.List;
@Component
@Order(value = 1)
@Slf4j
public class ScheduledTaskRunner implements ApplicationRunner {
@Autowired
private QuartzTaskService quartzTaskService;
@Autowired
private QuartzService quartzService;
@Override
public void run(ApplicationArguments args) throws Exception {
log.info(" >>>>>> 項目啟動完畢, 開啟 => 需要自啟的任務 開始!");
List<QuartzTask> activatedTaskList = quartzTaskService.list();
quartzService.initAllTask(activatedTaskList);
log.info(" >>>>>> 項目啟動完畢, 開啟 => 需要自啟的任務 結束!");
}
}
任務實體類:QuartzTask
映射數據庫自定義任務表
package com.anjie.manage.quartz.entity.po;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
@Data
@TableName(value = "quartz_task")
public class QuartzTask {
/**
* 主鍵
*/
@TableId(type = IdType.AUTO)
private Integer id;
/**
* 任務名稱
*/
private String taskName;
/**
* group名稱
*/
private String groupName;
/**
* job所在類
*/
private String jobClass;
/**
* 參數
*/
private String params;
/**
* cron表達式
*/
private String cron;
/**
* 狀態(tài)
*/
private Boolean status;
/**
* 任務描述
*/
private String des;
}
任務dao層,我是用的是mybatis-plus
package com.anjie.manage.quartz.dao;
import com.anjie.manage.quartz.entity.po.QuartzTask;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
@Repository
@Mapper
public interface QuartzTaskDao extends BaseMapper<QuartzTask> {
}
任務service層
package com.anjie.manage.quartz.service;
import com.anjie.manage.quartz.entity.po.QuartzTask;
import com.baomidou.mybatisplus.extension.service.IService;
public interface QuartzTaskService extends IService<QuartzTask> {
}
service實現類
package com.anjie.manage.quartz.service.impl;
import com.anjie.manage.quartz.entity.po.QuartzTask;
import com.anjie.manage.quartz.dao.QuartzTaskDao;
import com.anjie.manage.quartz.service.QuartzTaskService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
@Service
public class QuartzTaskServiceImpl
extends ServiceImpl<QuartzTaskDao, QuartzTask>
implements QuartzTaskService
{
}
任務controller
package com.anjie.manage.quartz.controller;
import com.anjie.manage.common.ResponseMessage;
import com.anjie.manage.quartz.service.QuartzService;
import com.anjie.manage.quartz.entity.po.QuartzTask;
import com.anjie.manage.quartz.service.QuartzTaskService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@RestController
@Slf4j
@RequestMapping("/quartz")
public class JobController {
@Autowired
private QuartzService quartzService;
@Autowired
private QuartzTaskService quartzTaskService;
@PostMapping("/job")
public ResponseMessage addJob(@RequestBody QuartzTask quartzTask){
QueryWrapper<QuartzTask> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("task_name",quartzTask.getTaskName());
QuartzTask queryResult = quartzTaskService.getOne(queryWrapper);
if (queryResult != null){
return ResponseMessage.fail("任務名稱已存在!");
}
quartzTaskService.save(quartzTask);
return ResponseMessage.ok("操作成功!");
}
@PutMapping("/job")
public ResponseMessage updateJob(@RequestBody QuartzTask quartzTask){
//判斷任務是否啟用
Boolean status = quartzTaskService.getById(quartzTask.getId()).getStatus();
if (status){
return ResponseMessage.fail("任務正在運行中,請暫停后修改!");
}
//判斷任務名稱是否重名
QueryWrapper<QuartzTask> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("task_name",quartzTask.getTaskName());
QuartzTask queryResult = quartzTaskService.getOne(queryWrapper);
if (queryResult != null &&!queryResult.getId().equals(quartzTask.getId())){
return ResponseMessage.fail("任務名稱已存在!");
}
quartzTaskService.updateById(quartzTask);
return ResponseMessage.ok("操作成功!");
}
@DeleteMapping("/job/{id}")
public ResponseMessage deleteJob(@PathVariable Integer id){
//判斷任務是否啟用
Boolean status = quartzTaskService.getById(id).getStatus();
if (status){
return ResponseMessage.fail("任務正在運行中,請暫停后刪除!");
}
quartzTaskService.removeById(id);
return ResponseMessage.ok("操作成功!");
}
@GetMapping("/job")
public ResponseMessage getJobPage(Page<QuartzTask> page,QuartzTask params){
QueryWrapper<QuartzTask> queryWrapper = new QueryWrapper<>();
if (StringUtils.isNotEmpty(params.getDes())){
queryWrapper.like("des",params.getDes());
}
if (StringUtils.isNotEmpty(params.getTaskName())){
queryWrapper.like("task_name",params.getTaskName());
}
if (StringUtils.isNotEmpty(params.getGroupName())){
queryWrapper.like("group_name",params.getGroupName());
}
if (params.getStatus() != null){
queryWrapper.eq("status",params.getStatus());
}
queryWrapper.orderByDesc("id");
IPage<QuartzTask> result = quartzTaskService.page(page,queryWrapper);
return ResponseMessage.ok("操作成功",result);
}
/**
* 修改任務的cron
*
* @return
*/
// @RequestMapping(value = "/updateJobCron",method = RequestMethod.PUT)
// public Object updateJobCron(Integer id, String cron) {
// QuartzTask quartzTask = quartzTaskService.getById(id);
// Map<String, String> resultMap = new HashMap<>();
// //如果存在quartzTask對象
// if (quartzTask != null) {
// //修改任務的cron
// quartzTask.setCron(cron);
// //更新quart_task
// quartzTaskService.updateById(quartzTask);
// //如果啟用狀態(tài)則修改當前已持久化的job
// if (quartzTask.getStatus()) {
// quartzService.updateJob(quartzTask);
// }
// resultMap.put("status", "0");
// resultMap.put("msg", "修改cron成功");
// return resultMap;
// }
// //不存在quartzTask對象
// resultMap.put("status", "1");
// resultMap.put("msg", "修改cron失敗");
// return resultMap;
// }
/**
* 是否啟用接口
*
* @return
*/
@PutMapping(value = "/jobStatus")
public ResponseMessage updateJobStatus(@RequestBody QuartzTask params) {
QuartzTask quartzTask = quartzTaskService.getById(params.getId());
if (quartzTask != null) {
//修改任務的啟用狀態(tài)
quartzTask.setStatus(params.getStatus());
//更新quart_task
boolean updateResult = quartzTaskService.updateById(quartzTask);
//根據status判斷是新增job還是刪除job
if (params.getStatus() && updateResult) {
quartzService.addJob(quartzTask);
} else if (updateResult){
quartzService.deleteJob(quartzTask);
}
return ResponseMessage.ok("修改狀態(tài)成功");
}
return ResponseMessage.fail("修改狀態(tài)失敗");
}
/**
* 啟用一次任務
* @author **
* @param id 任務id
* @return java.lang.Object
*/
@PostMapping("/runJob/{id}")
public ResponseMessage runJobOnce(@PathVariable Integer id){
QuartzTask quartzTask = quartzTaskService.getById(id);
if (quartzTask != null) {
quartzService.runJobOnce(quartzTask);
return ResponseMessage.ok("任務執(zhí)行成功");
}
return ResponseMessage.fail("任務執(zhí)行失敗");
}
}
到目前位置就對quartz框架整合完成,這里附上具體使用到的數據表
數據表
-- ---------------------------- -- Table structure for QRTZ_BLOB_TRIGGERS -- ---------------------------- DROP TABLE IF EXISTS `QRTZ_BLOB_TRIGGERS`; CREATE TABLE `QRTZ_BLOB_TRIGGERS` ( `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, `TRIGGER_NAME` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, `TRIGGER_GROUP` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, `BLOB_DATA` blob NULL, PRIMARY KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) USING BTREE, INDEX `SCHED_NAME`(`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) USING BTREE, CONSTRAINT `QRTZ_BLOB_TRIGGERS_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `QRTZ_TRIGGERS` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) ON DELETE RESTRICT ON UPDATE RESTRICT ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic; -- ---------------------------- -- Table structure for QRTZ_CALENDARS -- ---------------------------- DROP TABLE IF EXISTS `QRTZ_CALENDARS`; CREATE TABLE `QRTZ_CALENDARS` ( `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, `CALENDAR_NAME` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, `CALENDAR` blob NOT NULL, PRIMARY KEY (`SCHED_NAME`, `CALENDAR_NAME`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic; -- ---------------------------- -- Table structure for QRTZ_CRON_TRIGGERS -- ---------------------------- DROP TABLE IF EXISTS `QRTZ_CRON_TRIGGERS`; CREATE TABLE `QRTZ_CRON_TRIGGERS` ( `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, `TRIGGER_NAME` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, `TRIGGER_GROUP` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, `CRON_EXPRESSION` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, `TIME_ZONE_ID` varchar(80) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL, PRIMARY KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) USING BTREE, CONSTRAINT `QRTZ_CRON_TRIGGERS_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `QRTZ_TRIGGERS` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) ON DELETE RESTRICT ON UPDATE RESTRICT ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic; -- ---------------------------- -- Table structure for QRTZ_FIRED_TRIGGERS -- ---------------------------- DROP TABLE IF EXISTS `QRTZ_FIRED_TRIGGERS`; CREATE TABLE `QRTZ_FIRED_TRIGGERS` ( `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, `ENTRY_ID` varchar(95) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, `TRIGGER_NAME` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, `TRIGGER_GROUP` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, `INSTANCE_NAME` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, `FIRED_TIME` bigint(13) NOT NULL, `SCHED_TIME` bigint(13) NOT NULL, `PRIORITY` int(11) NOT NULL, `STATE` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, `JOB_NAME` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL, `JOB_GROUP` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL, `IS_NONCONCURRENT` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL, `REQUESTS_RECOVERY` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL, PRIMARY KEY (`SCHED_NAME`, `ENTRY_ID`) USING BTREE, INDEX `IDX_QRTZ_FT_TRIG_INST_NAME`(`SCHED_NAME`, `INSTANCE_NAME`) USING BTREE, INDEX `IDX_QRTZ_FT_INST_JOB_REQ_RCVRY`(`SCHED_NAME`, `INSTANCE_NAME`, `REQUESTS_RECOVERY`) USING BTREE, INDEX `IDX_QRTZ_FT_J_G`(`SCHED_NAME`, `JOB_NAME`, `JOB_GROUP`) USING BTREE, INDEX `IDX_QRTZ_FT_JG`(`SCHED_NAME`, `JOB_GROUP`) USING BTREE, INDEX `IDX_QRTZ_FT_T_G`(`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) USING BTREE, INDEX `IDX_QRTZ_FT_TG`(`SCHED_NAME`, `TRIGGER_GROUP`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic; -- ---------------------------- -- Table structure for QRTZ_JOB_DETAILS -- ---------------------------- DROP TABLE IF EXISTS `QRTZ_JOB_DETAILS`; CREATE TABLE `QRTZ_JOB_DETAILS` ( `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, `JOB_NAME` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, `JOB_GROUP` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, `DESCRIPTION` varchar(250) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL, `JOB_CLASS_NAME` varchar(250) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, `IS_DURABLE` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, `IS_NONCONCURRENT` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, `IS_UPDATE_DATA` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, `REQUESTS_RECOVERY` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, `JOB_DATA` blob NULL, PRIMARY KEY (`SCHED_NAME`, `JOB_NAME`, `JOB_GROUP`) USING BTREE, INDEX `IDX_QRTZ_J_REQ_RECOVERY`(`SCHED_NAME`, `REQUESTS_RECOVERY`) USING BTREE, INDEX `IDX_QRTZ_J_GRP`(`SCHED_NAME`, `JOB_GROUP`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic; -- ---------------------------- -- Table structure for QRTZ_LOCKS -- ---------------------------- DROP TABLE IF EXISTS `QRTZ_LOCKS`; CREATE TABLE `QRTZ_LOCKS` ( `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, `LOCK_NAME` varchar(40) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, PRIMARY KEY (`SCHED_NAME`, `LOCK_NAME`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic; -- ---------------------------- -- Table structure for QRTZ_PAUSED_TRIGGER_GRPS -- ---------------------------- DROP TABLE IF EXISTS `QRTZ_PAUSED_TRIGGER_GRPS`; CREATE TABLE `QRTZ_PAUSED_TRIGGER_GRPS` ( `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, `TRIGGER_GROUP` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, PRIMARY KEY (`SCHED_NAME`, `TRIGGER_GROUP`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic; -- ---------------------------- -- Table structure for QRTZ_SCHEDULER_STATE -- ---------------------------- DROP TABLE IF EXISTS `QRTZ_SCHEDULER_STATE`; CREATE TABLE `QRTZ_SCHEDULER_STATE` ( `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, `INSTANCE_NAME` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, `LAST_CHECKIN_TIME` bigint(13) NOT NULL, `CHECKIN_INTERVAL` bigint(13) NOT NULL, PRIMARY KEY (`SCHED_NAME`, `INSTANCE_NAME`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic; -- ---------------------------- -- Table structure for QRTZ_SIMPLE_TRIGGERS -- ---------------------------- DROP TABLE IF EXISTS `QRTZ_SIMPLE_TRIGGERS`; CREATE TABLE `QRTZ_SIMPLE_TRIGGERS` ( `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, `TRIGGER_NAME` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, `TRIGGER_GROUP` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, `REPEAT_COUNT` bigint(7) NOT NULL, `REPEAT_INTERVAL` bigint(12) NOT NULL, `TIMES_TRIGGERED` bigint(10) NOT NULL, PRIMARY KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) USING BTREE, CONSTRAINT `QRTZ_SIMPLE_TRIGGERS_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `QRTZ_TRIGGERS` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) ON DELETE RESTRICT ON UPDATE RESTRICT ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic; -- ---------------------------- -- Table structure for QRTZ_SIMPROP_TRIGGERS -- ---------------------------- DROP TABLE IF EXISTS `QRTZ_SIMPROP_TRIGGERS`; CREATE TABLE `QRTZ_SIMPROP_TRIGGERS` ( `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, `TRIGGER_NAME` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, `TRIGGER_GROUP` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, `STR_PROP_1` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL, `STR_PROP_2` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL, `STR_PROP_3` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL, `INT_PROP_1` int(11) NULL DEFAULT NULL, `INT_PROP_2` int(11) NULL DEFAULT NULL, `LONG_PROP_1` bigint(20) NULL DEFAULT NULL, `LONG_PROP_2` bigint(20) NULL DEFAULT NULL, `DEC_PROP_1` decimal(13, 4) NULL DEFAULT NULL, `DEC_PROP_2` decimal(13, 4) NULL DEFAULT NULL, `BOOL_PROP_1` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL, `BOOL_PROP_2` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL, PRIMARY KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) USING BTREE, CONSTRAINT `QRTZ_SIMPROP_TRIGGERS_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `QRTZ_TRIGGERS` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) ON DELETE RESTRICT ON UPDATE RESTRICT ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic; -- ---------------------------- -- Table structure for QRTZ_TRIGGERS -- ---------------------------- DROP TABLE IF EXISTS `QRTZ_TRIGGERS`; CREATE TABLE `QRTZ_TRIGGERS` ( `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, `TRIGGER_NAME` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, `TRIGGER_GROUP` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, `JOB_NAME` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, `JOB_GROUP` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, `DESCRIPTION` varchar(250) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL, `NEXT_FIRE_TIME` bigint(13) NULL DEFAULT NULL, `PREV_FIRE_TIME` bigint(13) NULL DEFAULT NULL, `PRIORITY` int(11) NULL DEFAULT NULL, `TRIGGER_STATE` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, `TRIGGER_TYPE` varchar(8) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, `START_TIME` bigint(13) NOT NULL, `END_TIME` bigint(13) NULL DEFAULT NULL, `CALENDAR_NAME` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL, `MISFIRE_INSTR` smallint(2) NULL DEFAULT NULL, `JOB_DATA` blob NULL, PRIMARY KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) USING BTREE, INDEX `IDX_QRTZ_T_J`(`SCHED_NAME`, `JOB_NAME`, `JOB_GROUP`) USING BTREE, INDEX `IDX_QRTZ_T_JG`(`SCHED_NAME`, `JOB_GROUP`) USING BTREE, INDEX `IDX_QRTZ_T_C`(`SCHED_NAME`, `CALENDAR_NAME`) USING BTREE, INDEX `IDX_QRTZ_T_G`(`SCHED_NAME`, `TRIGGER_GROUP`) USING BTREE, INDEX `IDX_QRTZ_T_STATE`(`SCHED_NAME`, `TRIGGER_STATE`) USING BTREE, INDEX `IDX_QRTZ_T_N_STATE`(`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`, `TRIGGER_STATE`) USING BTREE, INDEX `IDX_QRTZ_T_N_G_STATE`(`SCHED_NAME`, `TRIGGER_GROUP`, `TRIGGER_STATE`) USING BTREE, INDEX `IDX_QRTZ_T_NEXT_FIRE_TIME`(`SCHED_NAME`, `NEXT_FIRE_TIME`) USING BTREE, INDEX `IDX_QRTZ_T_NFT_ST`(`SCHED_NAME`, `TRIGGER_STATE`, `NEXT_FIRE_TIME`) USING BTREE, INDEX `IDX_QRTZ_T_NFT_MISFIRE`(`SCHED_NAME`, `MISFIRE_INSTR`, `NEXT_FIRE_TIME`) USING BTREE, INDEX `IDX_QRTZ_T_NFT_ST_MISFIRE`(`SCHED_NAME`, `MISFIRE_INSTR`, `NEXT_FIRE_TIME`, `TRIGGER_STATE`) USING BTREE, INDEX `IDX_QRTZ_T_NFT_ST_MISFIRE_GRP`(`SCHED_NAME`, `MISFIRE_INSTR`, `NEXT_FIRE_TIME`, `TRIGGER_GROUP`, `TRIGGER_STATE`) USING BTREE, CONSTRAINT `QRTZ_TRIGGERS_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `JOB_NAME`, `JOB_GROUP`) REFERENCES `QRTZ_JOB_DETAILS` (`SCHED_NAME`, `JOB_NAME`, `JOB_GROUP`) ON DELETE RESTRICT ON UPDATE RESTRICT ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic; -- ---------------------------- -- Table structure for quartz_task -- ---------------------------- DROP TABLE IF EXISTS `quartz_task`; CREATE TABLE `quartz_task` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主鍵', `task_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '任務名稱', `group_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT 'group名稱', `job_class` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT 'job所在類', `params` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '參數', `cron` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT 'cron表達式', `status` tinyint(1) NULL DEFAULT 0 COMMENT '狀態(tài)', `des` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '描述', PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 16 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;
具體使用
1、新建具體需要執(zhí)行任務
package com.anjie.manage.quartz;
import com.anjie.manage.quartz.service.QuartzTaskService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class Task01 {
@Autowired
private QuartzTaskService quartzTaskService;
public void test(String param){
quartzTaskService.list();
System.out.println("test01被執(zhí)行(任務示例)"+param);
}
}
2、配置定時任務
注意:
1.這里的任務路徑是需要執(zhí)行的類中的方法路徑,采用bean的名稱 + 方法名(例:task01.test),名稱首字母小寫,不然會找不到bean,也可以自己給需要執(zhí)行的任務類bean起名
2.參數是字符串,可以自己寫json字符串,是否傳參與方法中保持一致,方法中有形參,這里就必傳,方法沒有形參,這里就不傳,不然任務會執(zhí)行失敗

具體效果

總結
到此這篇關于springboot整合quartz定時任務框架的文章就介紹到這了,更多相關springboot整合quartz定時任務內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
詳解spring security 配置多個AuthenticationProvider
這篇文章主要介紹了詳解spring security 配置多個AuthenticationProvider ,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-05-05
SpringBoot FailureAnalyzer實例使用教程
FailureAnalyzer是一種在啟動時攔截exception并將其轉換為human-readable消息的好方法,包含在故障分析中。SpringBoot為application context相關的exceptions,JSR-303驗證等提供了這樣的分析器,實際上很容易創(chuàng)建自己的2022-12-12
Java并發(fā)編程示例(一):線程的創(chuàng)建和執(zhí)行
這篇文章主要介紹了Java并發(fā)編程示例(一):線程的創(chuàng)建和執(zhí)行,本文是系列文章的第一篇,需要的朋友可以參考下2014-12-12
如何使用IDEA的groovy腳本文件生成帶JPA注解的實體類(圖文詳解)
這篇文章主要介紹了如何使用IDEA的groovy腳本文件生成帶JPA注解的實體類,本文通過圖文并茂實例相結合給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-07-07
jsp+dao+bean+servlet(MVC模式)實現簡單用戶登錄和注冊頁面
這篇文章主要介紹了jsp+dao+bean+servlet(MVC模式)實現簡單用戶登錄和注冊頁面,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-12-12
Java內存模型(JMM)及happens-before原理
這篇文章主要介紹了java內存模型(JMM)及happens-before原理,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-04-04

