1、接口
package com.biz.oth.quartz.service;
import java.util.Map;
public interface QuartzManagerService {
/**
* 获得触发器对象
* @param paramMap
* @return
*/
public Map<String,Object> queryTriggersForMap(Map<String,Object> paramMap);
/**
* 添加一个定时任务
* @param paramMap
*/
public void addJob(Map<String, Object> paramMap);
/**
* 添加一个定时任务
* @param jobName 任务名
* @param triggerName 触发器名
* @param cronExpression 时间设置,参考quartz说明文档
* @param description TODO
*/
public void addJob(String jobName, String triggerName, String cronExpression, String description);
/**
* 生成Cron表达式
* @param paramMap
* @return
*/
public String getCroExpression(Map<String, Object> paramMap);
/**
* 暂停触发器
* @param triggerName
* @param triggerGroup
*/
public void pauseTrigger(String triggerName, String triggerGroup);
/**
* 重启触发器
* @param triggerName
* @param triggerGroup
*/
public void resumeTrigger(String triggerName, String triggerGroup);
/**
* 删除触发器
* @param triggerName
* @param triggerGroup
* @return
*/
public boolean removeTrigger(String triggerName, String triggerGroup);
/**
* 修改一个任务的触发时间
* @param paramMap
*/
public void modifyJobTime(Map<String, Object> paramMap);
/**
* 修改一个任务的触发时间
* @param jobName
* @param cronExpression
*/
public void modifyJobTime(String jobName, String cronExpression);
/**
* 修改一个任务的触发时间
* @param triggerName
* @param triggerGroup
* @param cronExpression
*/
public void modifyJobTime(String triggerName, String triggerGroup, String cronExpression);
/**
* 移除一个定时任务
* @param jobName
*/
public void removeJob(String jobName);
/**
*暂停一个job任务
* @param jobName
*/
public void pauseJob(String jobName);
/**
* 恢复一个job任务
* @param jobName
*/
public void resumeJob(String jobName);
/**
* 暂停调度中所有的job任务
*/
public void pauseAll();
/**
*
* 恢复调度中所有的job的任务
* 此方法重新恢复会多次调用暂停前的job
*/
public void resumeAll();
/**
* 启动所有定时任务
*/
public void startJobs();
/**
* 关闭所有定时任务
* 关闭后需要重新启动TOMCAT
*/
public void shutdownJobs();
}
2、实现类
package com.biz.oth.quartz.service.impl;
import java.util.HashMap;
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.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.TriggerKey;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ext.spring.jdbc.Condition;
import com.ext.spring.jdbc.ConditionDef;
import com.smart.biz.base.BaseDao;
import com.smart.biz.oth.quartz.MyQuartzJobBean;
import com.smart.biz.oth.quartz.service.QuartzManagerService;
import com.smart.common.Constant;
import com.smart.util.Utils;
@Service
public class QuartzManagerServiceImpl implements QuartzManagerService {
@Autowired
private BaseDao baseDao;
@Autowired
private Scheduler scheduler;
private ConditionDef trggerCondition = new ConditionDef(new Object[][] {
{ "JOB_NAME=:jobName" },
{ "JOB_GROUP=:jobGroup" },
{ "TRIGGER_NAME=:triggerName" },
{ "TRIGGER_GROUP=:triggerGroup" }
});
@Override
public Map<String,Object> queryTriggersForMap(Map<String,Object> paramMap) {
Condition condition = new Condition(trggerCondition, paramMap);
StringBuilder sql = new StringBuilder("select JOB_NAME jobName, JOB_GROUP jobGroup, TRIGGER_NAME triggerName, \n");
sql.append(" TRIGGER_GROUP triggerGroup \n ");
sql.append(" from QRTZ_TRIGGERS ");
sql.append(condition.getConditionClauseWithWhere());
return baseDao.queryForMap(sql.toString(), paramMap);
}
@Override
public void addJob(String jobName, String triggerName, String cronExpression, String description){
try {
// 任务执行类 ,任务名,任务组
JobBuilder jobBuilder = JobBuilder.newJob(MyQuartzJobBean.class).withIdentity(jobName, Constant.DEFAULT_JOB_GROUP);
jobBuilder.withDescription(description);//描述
jobBuilder.requestRecovery(true);//指示调度程序是否应该在遇到“恢复”或“失败”的情况下重新执行作业,默认false
jobBuilder.storeDurably(true);//quartz会把job持久化到数据库中 默认false
JobDetail jobDetail = jobBuilder.build();
// 触发器名,触发器组
TriggerBuilder<Trigger> triggerBuilder = TriggerBuilder.newTrigger().withIdentity(triggerName, Constant.DEFAULT_TRIGGER_GROUP);
triggerBuilder.withSchedule(CronScheduleBuilder.cronSchedule(cronExpression));
CronTrigger trigger = (CronTrigger) triggerBuilder.build();
scheduler.scheduleJob(jobDetail, trigger);
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
@Override
public void addJob(Map<String, Object> paramMap){
String jobName = (String) paramMap.get("jobName");
String triggerName = Utils.getUuid32();
String cronExpression = getCroExpression(paramMap);
addJob(jobName, triggerName, cronExpression, "");
}
@Override
public String getCroExpression(Map<String, Object> paramMap){
String year = (String)paramMap.get("year"),
week = (String)paramMap.get("week"),
month = (String)paramMap.get("month"),
day = (String) paramMap.get("day"),
hour = (String)paramMap.get("hour"),
minute = (String)paramMap.get("minute"),
second = (String)paramMap.get("second");
String defaultSecond = "0", defaultMinute = "0", defaultHour = "0",
defaultDay= "*",defaultMonth = "*", defaultWeek = "*", defaultYear = "*";
StringBuilder cronExpression = new StringBuilder();
if (second != null) defaultSecond = second;
if (minute != null) defaultMinute = minute;
if (hour != null) defaultHour = hour;
if (day != null) {
defaultDay = day;
//"?" 与{日期}互斥,即意味着若明确指定{日期}触发,则表示{星期}无意义,以免引起冲突和混乱
defaultWeek = "?";
}
if (month != null) defaultMonth = month;
if (week != null) {
defaultWeek = week;
//"?" 与{星期}互斥,即意味着若明确指定{星期}触发,则表示{日期}无意义,以免引起 冲突和混乱
defaultDay = "?";
}
if (year != null) defaultYear = year;
//如果都没空的时候,设置 defaultDay = "*", defaultDay = "?"
if (day == null && week == null) {
defaultDay = "*";
defaultWeek = "?";
}
cronExpression.append(defaultSecond).append(" ")
.append(defaultMinute).append(" ")
.append(defaultHour).append(" ")
.append(defaultDay).append(" ")
.append(defaultMonth).append(" ")
.append(defaultWeek).append(" ")
.append(defaultYear);
return cronExpression.toString();
}
@Override
public void pauseTrigger(String triggerName, String triggerGroup) {
try {
scheduler.pauseTrigger(new TriggerKey(triggerName, triggerGroup));// 停止触发器
} catch (SchedulerException e) {
throw new RuntimeException(e);
}
}
@Override
public void resumeTrigger(String triggerName, String triggerGroup) {
try {
scheduler.resumeTrigger(new TriggerKey(triggerName, triggerGroup));// 重启触发器
} catch (SchedulerException e) {
throw new RuntimeException(e);
}
}
@Override
public boolean removeTrigger(String triggerName, String triggerGroup) {
TriggerKey triggerKey = new TriggerKey(triggerName, triggerGroup);
try {
scheduler.pauseTrigger(triggerKey);// 停止触发器
return scheduler.unscheduleJob(triggerKey);// 移除触发器
} catch (SchedulerException e) {
throw new RuntimeException(e);
}
}
@Override
public void modifyJobTime(Map<String, Object> paramMap) {
String jobName = (String) paramMap.get("jobName");
String cronExpression = getCroExpression(paramMap);
modifyJobTime(jobName, cronExpression);
}
@Override
public void modifyJobTime(String jobName, String cronExpression) {
Map<String, Object> paramMap = new HashMap<String, Object>();
paramMap.put("jobName", jobName);
paramMap.put("jobGroup", Constant.DEFAULT_JOB_GROUP);
Map<String, Object> returnMap = queryTriggersForMap(paramMap);
if (returnMap != null) {
String triggerName = (String) returnMap.get("triggerName");
String triggerGroup = (String) returnMap.get("triggerGroup");
modifyJobTime(triggerName, triggerGroup, cronExpression);
}
}
@Override
public void modifyJobTime(String triggerName, String triggerGroup, String cronExpression) {
try {
TriggerKey triggerKey = new TriggerKey(triggerName, triggerGroup);
TriggerBuilder<Trigger> triggerBuilder = TriggerBuilder.newTrigger().withIdentity(triggerName, triggerGroup);
triggerBuilder.withSchedule(CronScheduleBuilder.cronSchedule(cronExpression));
CronTrigger trigger = (CronTrigger) triggerBuilder.build();
scheduler.rescheduleJob(triggerKey, trigger);
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
@Override
public void removeJob(String jobName) {
Map<String, Object> paramMap = new HashMap<String, Object>();
paramMap.put("jobName", jobName);
String jobGroup = Constant.DEFAULT_JOB_GROUP;
paramMap.put("jobGroup", jobGroup);
Map<String, Object> returnMap = queryTriggersForMap(paramMap);
if (returnMap != null) {
try {
String triggerName = (String) returnMap.get("triggerName");
String triggerGroup = (String) returnMap.get("triggerGroup");
removeTrigger(triggerName, triggerGroup); //移除触发器
scheduler.deleteJob(new JobKey(jobName, jobGroup));
} catch (SchedulerException e) {
e.printStackTrace();
}
}
}
@Override
public void startJobs() {
try {
scheduler.start();
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
@Override
public void shutdownJobs() {
try {
if(!scheduler.isShutdown()) {
scheduler.shutdown();
}
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
@Override
public void pauseAll() {
try {
scheduler.pauseAll();
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
@Override
public void resumeAll() {
try {
scheduler.resumeAll();
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
@Override
public void pauseJob(String jobName) {
try {
JobKey jobKey = new JobKey(jobName, Constant.DEFAULT_JOB_GROUP);
scheduler.pauseJob(jobKey);
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
@Override
public void resumeJob(String jobName) {
try {
JobKey jobKey = new JobKey(jobName, Constant.DEFAULT_JOB_GROUP);
scheduler.resumeJob(jobKey);
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
}
3、quartz.xml
<pre name="code" class="html"><?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean name="quartzScheduler"
class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="dataSource">
<ref bean="dataSource" />
</property>
<property name="schedulerContextAsMap">
<map>
<!-- spring 管理的service需要放到这里,才能够注入成功 -->
<description>schedulerContextAsMap</description>
<entry key="hyService" value-ref="hyService"/>
</map>
</property>
<property name="applicationContextSchedulerContextKey" value="applicationContextKey" />
<property name="configLocation" value="classpath:quartz.properties" />
</bean>
<bean id="jobDetail" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
<property name="jobClass">
<value>com.smart.biz.oth.quartz.MyQuartzJobBean</value>
</property>
<property name="durability" value="true" />
</bean>
</beans>
4、quartz.properties
org.quartz.scheduler.instanceName = DefaultQuartzScheduler
org.quartz.scheduler.instanceId = AUTO
org.quartz.scheduler.rmi.export = false
org.quartz.scheduler.rmi.proxy = false
org.quartz.scheduler.wrapJobExecutionInUserTransaction = false
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 10
org.quartz.threadPool.threadPriority = 5
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread = true
org.quartz.jobStore.misfireThreshold = 60000
#org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
#org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.HSQLDBDelegate
org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate
#org.quartz.jobStore.useProperties = true
org.quartz.jobStore.tablePrefix = QRTZ_
org.quartz.jobStore.isClustered = true
org.quartz.jobStore.clusterCheckinInterval = 20000
org.quartz.jobStore.maxMisfiresToHandleAtATime=1