Spring Boot与Quartz集成
一、Quartz配置信息
1. Maven依赖
添加quartz的依赖
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>${quartz.version}</version>
</dependency>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz-jobs</artifactId>
<version>${quartz.version}</version>
</dependency>
2. resources/quartz.properties文件
#============================================================================
# Configure Main Scheduler Properties
#============================================================================
org.quartz.scheduler.instanceName:XXWS
org.quartz.scheduler.instanceId:XXWS
org.quartz.scheduler.skipUpdateCheck:true
#============================================================================
# Configure ThreadPool
#============================================================================
org.quartz.threadPool.class:org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount:5
org.quartz.threadPool.threadPriority:5
#============================================================================
# Configure JobStore
#============================================================================
org.quartz.jobStore.misfireThreshold:60000
org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate
org.quartz.jobStore.useProperties=false
org.quartz.jobStore.dataSource=myDS
org.quartz.jobStore.tablePrefix=QRTZ_
org.quartz.jobStore.isClustered=true
#============================================================================
# Other Example Delegates
#============================================================================
#org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.DB2v6Delegate
#org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.DB2v7Delegate
#org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.DriverDelegate
#org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.HSQLDBDelegate
#org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.MSSQLDelegate
#org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.PointbaseDelegate
#org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.PostgreSQLDelegate
#org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate
#org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.WebLogicDelegate
#org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.oracle.OracleDelegate
#org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.oracle.WebLogicOracleDelegate
#============================================================================
# Configure Datasources
#============================================================================
org.quartz.dataSource.myDS.driver:com.mysql.jdbc.Driver
org.quartz.dataSource.myDS.URL:jdbc:mysql://localhost:3306/quartz?useSSL=false
org.quartz.dataSource.myDS.user:root
org.quartz.dataSource.myDS.password:root
org.quartz.dataSource.myDS.maxConnections:5
org.quartz.dataSource.myDS.validationQuery:select 0
#============================================================================
# Configure Plugins
#============================================================================
#org.quartz.plugin.shutdownHook.class: org.quartz.plugins.management.ShutdownHookPlugin
#org.quartz.plugin.shutdownHook.cleanShutdown: true
#org.quartz.plugin.triggHistory.class: org.quartz.plugins.history.LoggingJobHistoryPlugin
3.建表脚本 db.sql
#
# In your Quartz properties file, you'll need to set
# org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate
#
#
# By: Ron Cordell - roncordell
# I didn't see this anywhere, so I thought I'd post it here. This is the script from Quartz to create the tables in a MySQL database, modified to use INNODB instead of MYISAM.
DROP TABLE IF EXISTS QRTZ_FIRED_TRIGGERS;
DROP TABLE IF EXISTS QRTZ_PAUSED_TRIGGER_GRPS;
DROP TABLE IF EXISTS QRTZ_SCHEDULER_STATE;
DROP TABLE IF EXISTS QRTZ_LOCKS;
DROP TABLE IF EXISTS QRTZ_SIMPLE_TRIGGERS;
DROP TABLE IF EXISTS QRTZ_SIMPROP_TRIGGERS;
DROP TABLE IF EXISTS QRTZ_CRON_TRIGGERS;
DROP TABLE IF EXISTS QRTZ_BLOB_TRIGGERS;
DROP TABLE IF EXISTS QRTZ_TRIGGERS;
DROP TABLE IF EXISTS QRTZ_JOB_DETAILS;
DROP TABLE IF EXISTS QRTZ_CALENDARS;
CREATE TABLE QRTZ_JOB_DETAILS (
SCHED_NAME VARCHAR(120) NOT NULL,
JOB_NAME VARCHAR(200) NOT NULL,
JOB_GROUP VARCHAR(200) NOT NULL,
DESCRIPTION VARCHAR(250) NULL,
JOB_CLASS_NAME VARCHAR(250) NOT NULL,
IS_DURABLE VARCHAR(1) NOT NULL,
IS_NONCONCURRENT VARCHAR(1) NOT NULL,
IS_UPDATE_DATA VARCHAR(1) NOT NULL,
REQUESTS_RECOVERY VARCHAR(1) NOT NULL,
JOB_DATA BLOB NULL,
PRIMARY KEY (SCHED_NAME, JOB_NAME, JOB_GROUP)
)
ENGINE = InnoDB;
CREATE TABLE QRTZ_TRIGGERS (
SCHED_NAME VARCHAR(120) NOT NULL,
TRIGGER_NAME VARCHAR(200) NOT NULL,
TRIGGER_GROUP VARCHAR(200) NOT NULL,
JOB_NAME VARCHAR(200) NOT NULL,
JOB_GROUP VARCHAR(200) NOT NULL,
DESCRIPTION VARCHAR(250) NULL,
NEXT_FIRE_TIME BIGINT(13) NULL,
PREV_FIRE_TIME BIGINT(13) NULL,
PRIORITY INTEGER NULL,
TRIGGER_STATE VARCHAR(16) NOT NULL,
TRIGGER_TYPE VARCHAR(8) NOT NULL,
START_TIME BIGINT(13) NOT NULL,
END_TIME BIGINT(13) NULL,
CALENDAR_NAME VARCHAR(200) NULL,
MISFIRE_INSTR SMALLINT(2) NULL,
JOB_DATA BLOB NULL,
PRIMARY KEY (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP),
FOREIGN KEY (SCHED_NAME, JOB_NAME, JOB_GROUP)
REFERENCES QRTZ_JOB_DETAILS (SCHED_NAME, JOB_NAME, JOB_GROUP)
)
ENGINE = InnoDB;
CREATE TABLE QRTZ_SIMPLE_TRIGGERS (
SCHED_NAME VARCHAR(120) NOT NULL,
TRIGGER_NAME VARCHAR(200) NOT NULL,
TRIGGER_GROUP VARCHAR(200) 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),
FOREIGN KEY (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP)
REFERENCES QRTZ_TRIGGERS (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP)
)
ENGINE = InnoDB;
CREATE TABLE QRTZ_CRON_TRIGGERS (
SCHED_NAME VARCHAR(120) NOT NULL,
TRIGGER_NAME VARCHAR(200) NOT NULL,
TRIGGER_GROUP VARCHAR(200) NOT NULL,
CRON_EXPRESSION VARCHAR(120) NOT NULL,
TIME_ZONE_ID VARCHAR(80),
PRIMARY KEY (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP),
FOREIGN KEY (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP)
REFERENCES QRTZ_TRIGGERS (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP)
)
ENGINE = InnoDB;
CREATE TABLE QRTZ_SIMPROP_TRIGGERS
(
SCHED_NAME VARCHAR(120) NOT NULL,
TRIGGER_NAME VARCHAR(200) NOT NULL,
TRIGGER_GROUP VARCHAR(200) NOT NULL,
STR_PROP_1 VARCHAR(512) NULL,
STR_PROP_2 VARCHAR(512) NULL,
STR_PROP_3 VARCHAR(512) NULL,
INT_PROP_1 INT NULL,
INT_PROP_2 INT NULL,
LONG_PROP_1 BIGINT NULL,
LONG_PROP_2 BIGINT NULL,
DEC_PROP_1 NUMERIC(13, 4) NULL,
DEC_PROP_2 NUMERIC(13, 4) NULL,
BOOL_PROP_1 VARCHAR(1) NULL,
BOOL_PROP_2 VARCHAR(1) NULL,
PRIMARY KEY (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP),
FOREIGN KEY (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP)
REFERENCES QRTZ_TRIGGERS (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP)
)
ENGINE = InnoDB;
CREATE TABLE QRTZ_BLOB_TRIGGERS (
SCHED_NAME VARCHAR(120) NOT NULL,
TRIGGER_NAME VARCHAR(200) NOT NULL,
TRIGGER_GROUP VARCHAR(200) NOT NULL,
BLOB_DATA BLOB NULL,
PRIMARY KEY (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP),
INDEX (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP),
FOREIGN KEY (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP)
REFERENCES QRTZ_TRIGGERS (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP)
)
ENGINE = InnoDB;
CREATE TABLE QRTZ_CALENDARS (
SCHED_NAME VARCHAR(120) NOT NULL,
CALENDAR_NAME VARCHAR(200) NOT NULL,
CALENDAR BLOB NOT NULL,
PRIMARY KEY (SCHED_NAME, CALENDAR_NAME)
)
ENGINE = InnoDB;
CREATE TABLE QRTZ_PAUSED_TRIGGER_GRPS (
SCHED_NAME VARCHAR(120) NOT NULL,
TRIGGER_GROUP VARCHAR(200) NOT NULL,
PRIMARY KEY (SCHED_NAME, TRIGGER_GROUP)
)
ENGINE = InnoDB;
CREATE TABLE QRTZ_FIRED_TRIGGERS (
SCHED_NAME VARCHAR(120) NOT NULL,
ENTRY_ID VARCHAR(95) NOT NULL,
TRIGGER_NAME VARCHAR(200) NOT NULL,
TRIGGER_GROUP VARCHAR(200) NOT NULL,
INSTANCE_NAME VARCHAR(200) NOT NULL,
FIRED_TIME BIGINT(13) NOT NULL,
SCHED_TIME BIGINT(13) NOT NULL,
PRIORITY INTEGER NOT NULL,
STATE VARCHAR(16) NOT NULL,
JOB_NAME VARCHAR(200) NULL,
JOB_GROUP VARCHAR(200) NULL,
IS_NONCONCURRENT VARCHAR(1) NULL,
REQUESTS_RECOVERY VARCHAR(1) NULL,
PRIMARY KEY (SCHED_NAME, ENTRY_ID)
)
ENGINE = InnoDB;
CREATE TABLE QRTZ_SCHEDULER_STATE (
SCHED_NAME VARCHAR(120) NOT NULL,
INSTANCE_NAME VARCHAR(200) NOT NULL,
LAST_CHECKIN_TIME BIGINT(13) NOT NULL,
CHECKIN_INTERVAL BIGINT(13) NOT NULL,
PRIMARY KEY (SCHED_NAME, INSTANCE_NAME)
)
ENGINE = InnoDB;
CREATE TABLE QRTZ_LOCKS (
SCHED_NAME VARCHAR(120) NOT NULL,
LOCK_NAME VARCHAR(40) NOT NULL,
PRIMARY KEY (SCHED_NAME, LOCK_NAME)
)
ENGINE = InnoDB;
CREATE INDEX IDX_QRTZ_J_REQ_RECOVERY
ON QRTZ_JOB_DETAILS (SCHED_NAME, REQUESTS_RECOVERY);
CREATE INDEX IDX_QRTZ_J_GRP
ON QRTZ_JOB_DETAILS (SCHED_NAME, JOB_GROUP);
CREATE INDEX IDX_QRTZ_T_J
ON QRTZ_TRIGGERS (SCHED_NAME, JOB_NAME, JOB_GROUP);
CREATE INDEX IDX_QRTZ_T_JG
ON QRTZ_TRIGGERS (SCHED_NAME, JOB_GROUP);
CREATE INDEX IDX_QRTZ_T_C
ON QRTZ_TRIGGERS (SCHED_NAME, CALENDAR_NAME);
CREATE INDEX IDX_QRTZ_T_G
ON QRTZ_TRIGGERS (SCHED_NAME, TRIGGER_GROUP);
CREATE INDEX IDX_QRTZ_T_STATE
ON QRTZ_TRIGGERS (SCHED_NAME, TRIGGER_STATE);
CREATE INDEX IDX_QRTZ_T_N_STATE
ON QRTZ_TRIGGERS (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP, TRIGGER_STATE);
CREATE INDEX IDX_QRTZ_T_N_G_STATE
ON QRTZ_TRIGGERS (SCHED_NAME, TRIGGER_GROUP, TRIGGER_STATE);
CREATE INDEX IDX_QRTZ_T_NEXT_FIRE_TIME
ON QRTZ_TRIGGERS (SCHED_NAME, NEXT_FIRE_TIME);
CREATE INDEX IDX_QRTZ_T_NFT_ST
ON QRTZ_TRIGGERS (SCHED_NAME, TRIGGER_STATE, NEXT_FIRE_TIME);
CREATE INDEX IDX_QRTZ_T_NFT_MISFIRE
ON QRTZ_TRIGGERS (SCHED_NAME, MISFIRE_INSTR, NEXT_FIRE_TIME);
CREATE INDEX IDX_QRTZ_T_NFT_ST_MISFIRE
ON QRTZ_TRIGGERS (SCHED_NAME, MISFIRE_INSTR, NEXT_FIRE_TIME, TRIGGER_STATE);
CREATE INDEX IDX_QRTZ_T_NFT_ST_MISFIRE_GRP
ON QRTZ_TRIGGERS (SCHED_NAME, MISFIRE_INSTR, NEXT_FIRE_TIME, TRIGGER_GROUP, TRIGGER_STATE);
CREATE INDEX IDX_QRTZ_FT_TRIG_INST_NAME
ON QRTZ_FIRED_TRIGGERS (SCHED_NAME, INSTANCE_NAME);
CREATE INDEX IDX_QRTZ_FT_INST_JOB_REQ_RCVRY
ON QRTZ_FIRED_TRIGGERS (SCHED_NAME, INSTANCE_NAME, REQUESTS_RECOVERY);
CREATE INDEX IDX_QRTZ_FT_J_G
ON QRTZ_FIRED_TRIGGERS (SCHED_NAME, JOB_NAME, JOB_GROUP);
CREATE INDEX IDX_QRTZ_FT_JG
ON QRTZ_FIRED_TRIGGERS (SCHED_NAME, JOB_GROUP);
CREATE INDEX IDX_QRTZ_FT_T_G
ON QRTZ_FIRED_TRIGGERS (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP);
CREATE INDEX IDX_QRTZ_FT_TG
ON QRTZ_FIRED_TRIGGERS (SCHED_NAME, TRIGGER_GROUP);
COMMIT;
二、与spring boot的集成
1.让Quartz的Job使用Spring注入的Bean
将Scheduler交给spring生成, 在spirng-context-support jar包下org.springframework.scheduling.quartz包中有个SpringBeanJobFactory的类实现SchedulerContextAware,因此添加依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
</dependency>
import org.quartz.spi.TriggerFiredBundle;
import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.scheduling.quartz.SpringBeanJobFactory;
/**
* This JobFactory autowires automatically the created quartz bean with spring @Autowired dependencies.
*
* @author jelies (thanks to Brian Matthews: http://webcache.googleusercontent.com/search?q=cache:FH-N1i--sDgJ:blog.btmatthews.com/2011/09/24/inject-application-context-dependencies-in-quartz-job-beans/+&cd=7&hl=en&ct=clnk&gl=es)
*/
public final class AutowiringSpringBeanJobFactory extends SpringBeanJobFactory implements
ApplicationContextAware {
private transient AutowireCapableBeanFactory beanFactory;
@Override
public void setApplicationContext(final ApplicationContext context) {
beanFactory = context.getAutowireCapableBeanFactory();
}
@Override
protected Object createJobInstance(final TriggerFiredBundle bundle) throws Exception {
final Object job = super.createJobInstance(bundle);
beanFactory.autowireBean(job);
return job;
}
}
2. 从JobFactory中获取scheduler
import xx.quartz.AutowiringSpringBeanJobFactory;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.impl.StdSchedulerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @Copyright: Copyright (c) 2016,${year},
* @Description: ${todo}
*/
@Configuration
public class SchedulerConfig {
@Autowired
private ApplicationContext applicationContext;
/**
* config Scheduler
*
* @return
*/
@Bean(name = "uniScheduler")
public Scheduler getScheduler() {
Scheduler scheduler = null;
try {
scheduler = StdSchedulerFactory.getDefaultScheduler();
//
/**
* custom job factory of spring with DI support for @Autowired!(可以在job中使用spring Bean)
*/
AutowiringSpringBeanJobFactory jobFactory = new AutowiringSpringBeanJobFactory();
jobFactory.setApplicationContext(applicationContext);
scheduler.setJobFactory(jobFactory);
//
scheduler.start();
} catch (SchedulerException e) {
e.printStackTrace();
}
return scheduler;
}
}
3. ScheduledJob.java 任务
import java.util.Date;
/**
* This class represents a scheduled object in Quartz framework.
* The object is used by the ScheduledJobsVO to encapsulate details of a
* scheduled job during processing.
*/
public class ScheduledJob {
/*
* Variables to store the information for a scheduled job.
*/
private String jobName = null;
private String groupName = null;
private Date nextExecution = null;
private String jobClass = null;
private String jobState = null;
/**
* Default constructor
*
* @param jobName Name of the scheduled job
* @param groupName Group to which the scheduled job belongs to
* @param nextExecution The time of next execution for the job
* @param jobClass Name of the class executed for the job
* @param jobState the status of the job
*/
public ScheduledJob(String jobName, String groupName,
Date nextExecution, String jobClass, String jobState) {
super();
this.jobName = jobName;
this.groupName = groupName;
this.nextExecution = nextExecution;
this.jobClass = jobClass;
this.jobState = jobState;
}
/**
* Setter for a variable.
*
* @param jobName value for the variable
*/
public void setJobName(String jobName) {
this.jobName = jobName;
}
/**
* Getter for a variable.
*
* @return value of the variable
*/
public String getJobName() {
return jobName;
}
/**
* Setter for a variable.
*
* @param groupName value for the variable
*/
public void setGroupName(String groupName) {
this.groupName = groupName;
}
/**
* Getter for a variable.
*
* @return value of the variable
*/
public String getGroupName() {
return groupName;
}
/**
* Setter for a variable.
*
* @param nextExecution value for the variable
*/
public void setNextExecution(Date nextExecution) {
this.nextExecution = nextExecution;
}
/**
* Getter for a variable.
*
* @return value of the variable
*/
public Date getNextExecution() {
return nextExecution;
}
/**
* Setter for a variable.
*
* @param jobClass value for the variable
*/
public void setJobClass(String jobClass) {
this.jobClass = jobClass;
}
/**
* Getter for a variable.
*
* @return value of the variable
*/
public String getJobClass() {
return jobClass;
}
public String getJobState() {
return jobState;
}
public void setJobState(String jobState) {
this.jobState = jobState;
}
@Override
public String toString() {
String nextExecutionFormatted = (null == nextExecution ? "null" : String.format("%tc", nextExecution));
return jobName + " " + groupName + " " + nextExecutionFormatted + " " + jobClass;
}
}
4. SchedulerService
import xx.bean.ScheduledJob;
import org.quartz.SchedulerException;
import java.util.List;
/**
* Created by flowfire on 2017/2/28.
*/
public interface SchedulerService {
int startup();
boolean isStarted();
int standby();
int shutdown();
List<ScheduledJob> getScheduledJobs();
List<ScheduledJob> getCurrentlyExecutingJobs();
void deleteScheduledJob(String jobName, String groupName);
boolean scheduleJob(String jobName, String jobGroup, String jobClassName, String cronSchedule);
boolean scheduleJobWithDataOnce(String jobName, String jobGroup, String jobClassName, String[] keys, Object[] values);
boolean scheduleJobWithData(String jobName, String jobGroup, String jobClassName, String cronSchedule, String[] keys, Object[] values);
boolean rescheduleJob(String jobName, String jobGroup, String jobClassName, String cronSchedule);
boolean unscheduleJob(String jobName, String jobGroup);
boolean pauseTrigger(String triggerName, String group) throws SchedulerException;
boolean resumeTrigger(String triggerName, String group) throws SchedulerException;
boolean removeTrigger(String triggerName, String group) throws SchedulerException;
String getCronExpression(String triggerName, String group) throws SchedulerException;
}
impl
import xx.bean.ScheduledJob;
import xx.service.SchedulerService;
import org.quartz.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import static org.quartz.impl.matchers.GroupMatcher.groupEquals;
/**
* Created by flowfire on 2017/2/28.
*/
@Service("schedulerService")
public class SchedulerServiceImpl implements SchedulerService {
private Logger logger = LoggerFactory.getLogger(getClass());
@Resource(name = "uniScheduler")
Scheduler scheduler;
/**
* 开启任务调度
*
* @return
*/
@Override
public int startup() {
try {
if (scheduler.isInStandbyMode()) {//Standby Mode
scheduler.start();
return 1;
} else if (scheduler.isStarted()) {
return 0;
} else {
return -1;
}
} catch (SchedulerException e) {
e.printStackTrace();
}
return -1;
}
/**
* 检查调度是否启动
*
* @return
* @throws SchedulerException
*/
@Override
public boolean isStarted() {
try {
return scheduler.isStarted();
} catch (SchedulerException e) {
e.printStackTrace();
}
return false;
}
/**
* 使处于standby模式
*
* @return
*/
@Override
public int standby() {
try {
if (scheduler.isStarted()) { //Started Mode
scheduler.standby(); //使处于standby模式
return 1;
} else if (scheduler.isInStandbyMode()) {// Standby Mode
return 0;
} else {
return -1;
}
} catch (SchedulerException e) {
e.printStackTrace();
}
return -1;
}
/**
* 关闭任务调度
*
* @return
*/
@Override
public int shutdown() {
try {
if (scheduler.isStarted()) {//Started Mode
scheduler.shutdown(true);//true:等任务结束后停止;default\false:立即停止但等任务执行完;
return 1;
} else if (scheduler.isInStandbyMode()) {//Standby-Mode
scheduler.shutdown(false);
return 1;
} else {//Shutdown-Mode
return -1;
}
} catch (SchedulerException e) {
e.printStackTrace();
}
return -1;
}
/**
* Gets a list of scheduled jobs
*
* @return list of scheduler jobs
*/
@Override
public List<ScheduledJob> getScheduledJobs() {
logger.info("QuartzSchedulerSingleton.getScheduledJobs Start ");
List<ScheduledJob> result = new ArrayList<>();
try {
// Loop through the groups and all jobs for each group
for (String groupName : scheduler.getJobGroupNames()) {
for (JobKey jobKey :
scheduler.getJobKeys(groupEquals(groupName))) {
String jobName = jobKey.getName();
String jobGroup = jobKey.getGroup();
// Get the trigger for the job to determine next execution
List<Trigger> triggers =
(List<Trigger>) scheduler.getTriggersOfJob(jobKey);
// get the state from the triggerKey
Trigger.TriggerState triggerState = scheduler.getTriggerState(triggers.get(0).getKey());
Date nextFireTime = triggers.get(0).getNextFireTime();
// Get the JobDetail to obtain the name of the class for the job
JobDetail jobDetail = scheduler.getJobDetail(jobKey);
// Add a POJO object to the list containing the details of the scheduled jobs
ScheduledJob temp =
new ScheduledJob(jobName, jobGroup, nextFireTime,
jobDetail.getJobClass().getName(), triggerState.name());
logger.info("QuartzSchedulerSingleton.getScheduledJobs job : " + temp);
result.add(temp);
}
}
} catch (Exception e) {
throw new RuntimeException(e);
}
logger.info("QuartzSchedulerSingleton.getScheduledJobs result " + result);
return result;
}
/**
* Get Currently Executing Jobs
*
* @return
*/
@Override
public List<ScheduledJob> getCurrentlyExecutingJobs() {
List<ScheduledJob> result = new ArrayList<>();
try {
List<JobExecutionContext> jobs = scheduler.getCurrentlyExecutingJobs();
for (JobExecutionContext job : jobs) {
JobDetail jobDetail = job.getJobDetail();
JobKey jobKey = jobDetail.getKey();
// Get the trigger for the job to determine next execution
List<Trigger> triggers =
(List<Trigger>) scheduler.getTriggersOfJob(jobKey);
// get the state from the triggerKey
Trigger.TriggerState triggerState = scheduler.getTriggerState(triggers.get(0).getKey());
Date nextFireTime = triggers.get(0).getNextFireTime();
// Add a POJO object to the list containing the details of the scheduled jobs
ScheduledJob temp =
new ScheduledJob(jobKey.getName(), jobKey.getGroup(), nextFireTime,
jobDetail.getJobClass().getName(), triggerState.name());
result.add(temp);
}
} catch (SchedulerException e) {
e.printStackTrace();
}
return result;
}
/**
* Delete scheduled job
*
* @param jobName name of the job to be deleted
* @param groupName group name of the job to be deleted
*/
@Override
public void deleteScheduledJob(String jobName, String groupName) {
logger.info("QuartzSchedulerSingleton.deleteScheduledJob Start; " + jobName + " " + groupName);
try {
// Construct the key for the job to be deleted
JobKey jobKey = new JobKey(jobName, groupName);
// Delete the job
scheduler.deleteJob(jobKey);
} catch (Exception e) {
throw new RuntimeException(e);
}
logger.info("QuartzSchedulerSingleton.deleteScheduledJob End ");
}
/**
* Schedule a job
*
* @param jobName name of the job to be scheduled
* @param jobClassName class of the job to be schedule
* @param cronSchedule the cron based schedule for the job
*/
@Override
public boolean scheduleJob(String jobName, String jobGroup, String jobClassName, String cronSchedule) {
logger.info("QuartzSchedulerSingleton.scheduleJob Start; " + jobName + " " + jobClassName + " " + cronSchedule);
try {
Class jobClass = Class.forName(jobClassName);
// Create the job
JobDetail job =
JobBuilder.newJob(jobClass).withIdentity(jobName, jobGroup).build();
// Create a new cron based schedule
Trigger trigger =
TriggerBuilder.newTrigger().withIdentity(jobName, jobGroup).withSchedule(CronScheduleBuilder.cronSchedule(cronSchedule)).build();
scheduler.scheduleJob(job, trigger);
return true;
} catch (Exception e) {
e.printStackTrace();
}
logger.info("QuartzSchedulerSingleton.scheduleJob End ");
return false;
}
/**
* 仅执行一次任务(数据)
*
* @param jobName
* @param jobGroup
* @param jobClassName
* @return
*/
@Override
public boolean scheduleJobWithDataOnce(String jobName, String jobGroup, String jobClassName, String[] keys, Object[] values) {
logger.info("QuartzSchedulerSingleton.scheduleJob Start; " + jobName + " " + jobClassName);
try {
Class jobClass = Class.forName(jobClassName);
// Create the job
JobDetail job =
JobBuilder.newJob(jobClass).withIdentity(jobName, jobGroup).build();
//添加数据
if (keys != null && values != null && keys.length == values.length) {
for (int i = 0; i < keys.length; i++) {
job.getJobDataMap().put(keys[i], String.valueOf(values[i]));
}
}
// Create a new cron based schedule
SimpleTrigger trigger = TriggerBuilder.newTrigger()
.withIdentity(jobName, jobGroup)
.startAt(new Date())
.withSchedule(
SimpleScheduleBuilder.simpleSchedule()
.withIntervalInSeconds(3)
.withRepeatCount(0))//重复执行的次数,因为加入任务的时候马上执行了,所以不需要重复,否则会多一次。
.build();
scheduler.scheduleJob(job, trigger);
return true;
} catch (Exception e) {
e.printStackTrace();
}
logger.info("QuartzSchedulerSingleton.scheduleJob End ");
return false;
}
/**
* 运行任务(数据)
*
* @param jobName
* @param jobGroup
* @param jobClassName
* @param cronSchedule
* @param keys
* @param values
* @return
*/
@Override
public boolean scheduleJobWithData(String jobName, String jobGroup, String jobClassName, String cronSchedule, String[] keys, Object[] values) {
logger.info("QuartzSchedulerSingleton.scheduleJob Start; " + jobName + " " + jobClassName + " " + cronSchedule);
try {
Class jobClass = Class.forName(jobClassName);
// Create the job
JobDetail job =
JobBuilder.newJob(jobClass).withIdentity(jobName, jobGroup).build();
//添加数据
if (keys != null && values != null && keys.length == values.length) {
for (int i = 0; i < keys.length; i++) {
job.getJobDataMap().put(keys[i], String.valueOf(values[i]));
}
}
// Create a new cron based schedule
Trigger trigger =
TriggerBuilder.newTrigger().withIdentity(jobName, jobGroup).withSchedule(CronScheduleBuilder.cronSchedule(cronSchedule)).build();
scheduler.scheduleJob(job, trigger);
return true;
} catch (Exception e) {
e.printStackTrace();
}
logger.info("QuartzSchedulerSingleton.scheduleJob End ");
return false;
}
/**
* ReSchedule a job
*
* @param jobName name of the job to be scheduled
* @param jobClassName class of the job to be schedule
* @param cronSchedule the cron based schedule for the job
*/
@Override
public boolean rescheduleJob(String jobName, String jobGroup, String jobClassName, String cronSchedule) {
logger.info("QuartzSchedulerSingleton.scheduleJob Start; " + jobName + " " + jobClassName + " " + cronSchedule);
JobKey jobKey = JobKey.jobKey(jobName, jobGroup);
try {
JobDetail jobDetail = scheduler.getJobDetail(jobKey);
if (null == jobDetail) {//jobDetail as uniqueKey
scheduleJob(jobName, jobGroup, jobClassName, cronSchedule);
} else {
// Get the trigger for the job to determine next execution
List<Trigger> triggers =
(List<Trigger>) scheduler.getTriggersOfJob(jobKey);
if (null != triggers && triggers.size() > 0) {
CronTrigger trigger = (CronTrigger) triggers.get(0);
trigger = trigger.getTriggerBuilder()
.startNow()
.withSchedule(CronScheduleBuilder.cronSchedule(cronSchedule))
.build();
scheduler.rescheduleJob(trigger.getKey(), trigger);
}
}
return true;
} catch (SchedulerException e) {
e.printStackTrace();
}
logger.info("QuartzSchedulerSingleton.scheduleJob End ");
return false;
}
/**
* 关闭任务
*
* @param jobName
* @return
*/
@Override
public boolean unscheduleJob(String jobName, String jobGroup) {
JobKey jobKey = JobKey.jobKey(jobName, jobGroup);
try {
List<Trigger> triggers =
(List<Trigger>) scheduler.getTriggersOfJob(jobKey);
if (null != triggers && triggers.size() > 0) {
return scheduler.unscheduleJob(triggers.get(0).getKey());
}
} catch (SchedulerException e) {
e.printStackTrace();
}
return false;
}
/**
* 暂停任务
*
* @param triggerName
* @param group
*/
@Override
public boolean pauseTrigger(String triggerName, String group) throws SchedulerException {
scheduler.pauseTrigger(new TriggerKey(triggerName, group));// 停止触发器
return true;
}
/**
* 恢复任务
*
* @param triggerName
* @param group
*/
@Override
public boolean resumeTrigger(String triggerName, String group) throws SchedulerException {
scheduler.resumeTrigger(new TriggerKey(triggerName, group));// 重启触发器
return true;
}
/**
* 移除任务
*
* @param triggerName
* @param group
* @return
*/
@Override
public boolean removeTrigger(String triggerName, String group) throws SchedulerException {
TriggerKey triggerKey = new TriggerKey(triggerName, group);
scheduler.pauseTrigger(triggerKey);// 停止触发器
return scheduler.unscheduleJob(triggerKey);// 移除触发器
}
/**
* 获取时间表达式
*
* @param triggerName
* @param group
* @return
*/
@Override
public String getCronExpression(String triggerName, String group) throws SchedulerException {
TriggerKey triggerKey = new TriggerKey(triggerName, group);
CronTrigger cronTrigger= (CronTrigger) scheduler.getTrigger(triggerKey);
return cronTrigger.getCronExpression();
}
}
5. 任务类
import com.google.gson.Gson;
import org.quartz.Job;
import org.quartz.JobDataMap;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import java.io.IOException;
import java.util.*;
public class XXTask implements Job {
private Logger log = LoggerFactory.getLogger(XXTask.class);
@Autowired
JdbcService jdbcService;
@Override
public void execute(JobExecutionContext jobExecutionContext)
throws JobExecutionException {
JobDataMap dataMap = jobExecutionContext.getJobDetail().getJobDataMap();
int id = dataMap.getInt("id");
runjob(id);
}
/**
* runjob
*
* @param id
* @return
*/
private int runjob(int id) {
return 0;
}
}
6. 任务调度
@Autowired
SchedulerService schedulerService;
flag = schedulerService.scheduleJobWithDataOnce(jobName, jobGroup,
"xx", new String[]{"id"}, new Object[]{1});