下面介绍SSM+Quartz的示例,项目地址: quartz-spring
一:环境介绍
工具:Spring Tool Suite + Mysql
框架:Spring+SpringMVC+Mybatis
前端: easy ui
日志:logback
构建工具:Maven
Quartz版本:2.2.3
二:SSM+Quartz集成详解
1.项目结构
2.配置文件介绍
(1):在ApplicationContext.xml中添加下面的配置:
<bean name="quartzScheduler"
class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="dataSource" ref="dataSource" /><!-- 读取spring配置的数据库,不去加载quartz.properties -->
<property name="applicationContextSchedulerContextKey" value="applicationContextKey" />
<property name="configLocation" value="classpath:quartz.properties" />
</bean>
(2):添加quartz.properties配置文件
# Default Properties file for use by StdSchedulerFactory
# to create a Quartz Scheduler Instance, if a different
# properties file is not explicitly specified.
#
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.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate
org.quartz.jobStore.useProperties:true
#指定前缀
org.quartz.jobStore.tablePrefix: QRTZ_
3.核心代码
package com.wyj.controller;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang.StringUtils;
import org.quartz.CronTrigger;
import org.quartz.JobDataMap;
import org.quartz.JobDetail;
import org.quartz.JobKey;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.Trigger;
import org.quartz.TriggerKey;
import org.quartz.impl.matchers.GroupMatcher;
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.alibaba.fastjson.JSON;
import com.wyj.entity.JobDto;
import com.wyj.entity.Retval;
import com.wyj.service.QuartzService;
/**
* 定时任务 Controller
*
*
* @author:WangYuanJun
* @date:2018年1月7日 下午10:15:33
*/
@Controller
@RequestMapping(value = "/quartz")
public class QuartzController {
private Logger logger = LoggerFactory.getLogger(this.getClass());
@Autowired
private Scheduler quartzScheduler;
@Autowired
private QuartzService quartzService;
@RequestMapping("/index")
public String index() {
return "/quartz/list";
}
/**
* 定时列表页
*
* @return
* @throws SchedulerException
*/
@ResponseBody
@RequestMapping(value = "/list")
public String listJob(HttpServletRequest request, HttpServletResponse response) throws SchedulerException {
List<JobDto> jobInfos = this.getSchedulerJobInfo();
return JSON.toJSONString(jobInfos);
}
/**
* 新建job
*
* @param jobDto
* @return
*/
@ResponseBody
@RequestMapping(value = "/add")
public Retval save(JobDto jobDto) {
Retval retval = Retval.newInstance();
try {
quartzService.addJob(jobDto.getJobName(), jobDto.getJobGroupName(), jobDto.getTriggerName(), jobDto.getTriggerGroupName(), Class.forName(jobDto.getJobClass()), jobDto.getCronExpression());
} catch (Exception e) {
logger.error(e.getMessage());
}
return retval;
}
/**
* 编辑job
*
* @param jobDto
* @return
*/
@ResponseBody
@RequestMapping(value = "/edit", method = RequestMethod.POST)
public Retval edit(JobDto jobDto) {
Retval retval = Retval.newInstance();
try {
boolean result = quartzService.modifyJobTime(jobDto.getOldJobName(), jobDto.getOldJobGroupName(), jobDto.getOldTriggerName(), jobDto.getOldTriggerGroupName(), jobDto.getJobName(), jobDto.getJobGroupName(), jobDto.getTriggerName(), jobDto.getTriggerGroupName(), jobDto.getCronExpression());
if (result) {
retval.put("message", "修改任务成功!");
} else {
retval.put("message", "修改任务失败!");
}
} catch (Exception e) {
logger.error(e.getMessage());
}
return retval;
}
/**
* 暂停job
*
* @param jobName
* @param jobGroupName
* @return
*/
@ResponseBody
@RequestMapping(value = "/stopJob", method = RequestMethod.POST)
public Retval stopJob(@RequestParam("jobName") String jobName, @RequestParam("jobGroupName") String jobGroupName) {
Retval retval = Retval.newInstance();
if (StringUtils.isEmpty(jobName) || StringUtils.isEmpty(jobGroupName)) {
retval.fail();
retval.put("message", "暂停失败");
} else {
try {
quartzService.pauseJob(jobName, jobGroupName);
retval.put("message", "暂停成功");
} catch (Exception e) {
logger.error(e.getMessage());
}
}
return retval;
}
/**
* 恢复job
*
* @param jobName
* @param jobGroupName
* @return
*/
@ResponseBody
@RequestMapping(value = "/resumeJob", method = RequestMethod.POST)
public Retval resumeJob(@RequestParam("jobName") String jobName, @RequestParam("jobGroupName") String jobGroupName) {
Retval retval = Retval.newInstance();
if (StringUtils.isEmpty(jobName) || StringUtils.isEmpty(jobGroupName)) {
retval.fail();
retval.put("message", "恢复失败");
} else {
try {
quartzService.resumeJob(jobName, jobGroupName);
retval.put("message", "恢复成功");
} catch (Exception e) {
logger.error(e.getMessage());
}
}
return retval;
}
/**
* 删除job
*
* @param jobName
* @param jobGroupName
* @param triggerName
* @param triggerGroupName
* @return
*/
@RequestMapping(value = "/deleteJob", method = RequestMethod.POST)
@ResponseBody
public Retval deleteJob(@RequestParam("jobName") String jobName, @RequestParam("jobGroupName") String jobGroupName, @RequestParam("triggerName") String triggerName, @RequestParam("triggerGroupName") String triggerGroupName) {
Retval retval = Retval.newInstance();
if (StringUtils.isEmpty(jobName) || StringUtils.isEmpty(jobGroupName) || StringUtils.isEmpty(triggerName) || StringUtils.isEmpty(triggerGroupName)) {
retval.fail();
retval.put("message", "删除失败");
} else {
try {
quartzService.removeJob(jobName, jobGroupName, triggerName, triggerGroupName);
retval.put("message", "删除成功");
} catch (Exception e) {
logger.error(e.getMessage());
}
}
return retval;
}
private List<JobDto> getSchedulerJobInfo() throws SchedulerException {
List<JobDto> jobInfos = new ArrayList<JobDto>();
List<String> triggerGroupNames = quartzScheduler.getTriggerGroupNames();
for (String triggerGroupName : triggerGroupNames) {
Set<TriggerKey> triggerKeySet = quartzScheduler.getTriggerKeys(GroupMatcher.triggerGroupEquals(triggerGroupName));
for (TriggerKey triggerKey : triggerKeySet) {
Trigger t = quartzScheduler.getTrigger(triggerKey);
if (t instanceof CronTrigger) {
CronTrigger trigger = (CronTrigger) t;
JobKey jobKey = trigger.getJobKey();
JobDetail jd = quartzScheduler.getJobDetail(jobKey);
JobDto jobInfo = new JobDto();
jobInfo.setJobName(jobKey.getName());
jobInfo.setJobGroupName(jobKey.getGroup());
jobInfo.setTriggerName(triggerKey.getName());
jobInfo.setTriggerGroupName(triggerKey.getGroup());
jobInfo.setCronExpression(trigger.getCronExpression());
jobInfo.setNextFireTime(trigger.getNextFireTime());
jobInfo.setPreviousFireTime(trigger.getPreviousFireTime());
jobInfo.setStartTime(trigger.getStartTime());
jobInfo.setEndTime(trigger.getEndTime());
jobInfo.setJobClass(jd.getJobClass().getCanonicalName());
// jobInfo.setDuration(Long.parseLong(jd.getDescription()));
Trigger.TriggerState triggerState = quartzScheduler.getTriggerState(trigger.getKey());
jobInfo.setJobStatus(triggerState.toString());// NONE无,
// NORMAL正常,
// PAUSED暂停,
// COMPLETE完全,
// ERROR错误,
// BLOCKED阻塞
JobDataMap map = quartzScheduler.getJobDetail(jobKey).getJobDataMap();
if (null != map && map.size() != 0) {
jobInfo.setCount(Long.valueOf((String) map.get("count")));
jobInfo.setJobDataMap(map);
} else {
jobInfo.setJobDataMap(new JobDataMap());
}
jobInfos.add(jobInfo);
}
}
}
return jobInfos;
}
}
4.job
package com.wyj.job;
import java.util.Date;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
/**
* Job任务
*
*
* @author:WangYuanJun
* @date:2018年1月5日 下午10:22:42
*/
public class HelloWorldJob implements Job {
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
System.out.println("----hello world---" + new Date());
}
}
三:运行效果介绍