package com.sinosoft.service;
import java.io.Serializable;
import java.util.List;
import com.sinosoft.common.Page;
import com.sinosoft.dto.ScheduleDTO;
import com.sinosoft.entity.Schedule;
public interface ScheduleService {
public Serializable saveSchedule(ScheduleDTO dto);
public void updateSchedule(String id,ScheduleDTO dto);
public void deleteSchedules(String[] idArr);
public Page<?> qryScheduleOfPage(int page,int rows,ScheduleDTO dto);
public List<?> qrySchedule();
public List<?> qryScheduleAll();
public Schedule findSchedule(String id);
public void deleteSchedule(String jobcode) ;
public void stopScheduleJob(String jobCode);
public void startScheduleJob(String jobCode);
}
package com.sinosoft.service.impl;
import java.io.Serializable;
import java.text.ParseException;
import java.util.Date;
import java.util.List;
import javax.annotation.Resource;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.Session;
import org.quartz.CronScheduleBuilder;
import org.quartz.CronTrigger;
import org.quartz.Job;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.JobKey;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.TriggerKey;
import org.quartz.impl.StdSchedulerFactory;
import org.quartz.impl.triggers.CronTriggerImpl;
import org.springframework.orm.hibernate5.HibernateTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.sinosoft.common.BeanFactory;
import com.sinosoft.common.Page;
import com.sinosoft.dao.ScheduleDao;
import com.sinosoft.dto.ScheduleDTO;
import com.sinosoft.entity.Schedule;
import com.sinosoft.service.ScheduleService;
import com.sinosoft.util.DateUtil;
/**
* 任务调度工具类 需要执行调度的任务 需实现Job接口
*
* @author xushuyi
*/
@Service
public class ScheduleServiceImp implements ScheduleService {
private static Log logger = LogFactory.getLog(ScheduleServiceImp.class);
/**
* 任务状态运行
*/
public static final Integer JOBSTATUS_RUNNING = 1;
/**
* 任务状态停止
*/
public static final Integer JOBSTATUS_STOPED = 2;
/**
* 初始化任务调度器
*/
private SchedulerFactory schedulerFactory = new StdSchedulerFactory();
/**
* 默认的工作组
*/
private static String JOB_GROUP_NAME = "_default_job_group";
/**
* 默认的触发器组
*/
private static String TRIGGER_GROUP_NAME = "_default_trigger_group";
@Resource
private ScheduleDao scheduleDao;
/**
* hibernate事物模板
*/
private HibernateTemplate template = null;
/**
* 保存任务调度
*/
@Override
@Transactional
public Serializable saveSchedule(ScheduleDTO dto) {
try {
Date date = new Date();
Schedule schedule = new Schedule();
schedule.setJobcode(dto.getJobcode());
schedule.setJobclass(dto.getJobclass());
schedule.setJobdesc(dto.getJobdesc());
schedule.setCronexpression(dto.getCronexpression());
schedule.setJobstatus(dto.getJobstatus());
schedule.setCreatedate(DateUtil.convertDate(date, DateUtil.YYYY_MM_DD));
schedule.setCreatetime(DateUtil.convertDate(date, DateUtil.HHMMSS));
if (dto.getJobstatus() == 1) { //启用定时任务调度
scheduleAnJob(schedule.getJobcode(), JOB_GROUP_NAME, schedule.getJobcode(),
TRIGGER_GROUP_NAME, schedule.getJobclass(),
schedule.getCronexpression());
}
Serializable serializable = scheduleDao.save(schedule);
return serializable;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 更新任务调度
*/
@Override
@Transactional
public void updateSchedule(String id, ScheduleDTO dto) {
Scheduler sched;
try {
Date date = new Date();
sched = schedulerFactory.getScheduler();
TriggerKey triggerKey = new TriggerKey(StringUtils.trimToEmpty(dto.getJobcode()), TRIGGER_GROUP_NAME);
sched.pauseTrigger(triggerKey);// 停止触发器
sched.unscheduleJob(triggerKey);// 移除触发器
JobKey jobKey = new JobKey(StringUtils.trimToEmpty(dto.getJobcode()), JOB_GROUP_NAME);
sched.deleteJob(jobKey);// 删除任务
Schedule schedule = findSchedule(StringUtils.trimToEmpty(dto.getJobcode()));
if (schedule != null) {
schedule.setCronexpression(StringUtils.trimToEmpty(dto.getCronexpression()));
schedule.setJobdesc(dto.getJobdesc());
schedule.setJobstatus(dto.getJobstatus());
schedule.setJobclass(StringUtils.trimToEmpty(dto.getJobclass()));
schedule.setModifydate(DateUtil.convertDate(date, DateUtil.YYYY_MM_DD));
schedule.setModifytime(DateUtil.convertDate(date, DateUtil.HHMMSS));
if (dto.getJobstatus() == 1) { //启用定时任务调度
scheduleAnJob(schedule.getJobcode(), JOB_GROUP_NAME, schedule.getJobcode(),
TRIGGER_GROUP_NAME, schedule.getJobclass(),
schedule.getCronexpression());
}
scheduleDao.update(schedule);
}
} catch (SchedulerException e) {
e.printStackTrace();
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 删除批量定时任务调度
*/
@Override
@Transactional
public void deleteSchedules(String[] idArr) {
if (idArr != null && !"".equals(idArr)) {
scheduleDao.removes(idArr, Schedule.class);
}
}
/**
* 删除单个定时任务调度
*/
@Override
@Transactional
public void deleteSchedule(String jobcode) {
try {
removeJob(jobcode);
} catch (SchedulerException e) {
e.printStackTrace();
}
}
/**
* 分页查询定时任务调度
*/
@Override
public Page<?> qryScheduleOfPage(int page, int rows, ScheduleDTO dto) {
StringBuilder querySql = new StringBuilder(
"select r.* from (select Schedule.*,(case Schedule.jobstatus when 1 then '启用' else '停用' end ) jobstatusname from schedule Schedule where 1=1 ");
if (!(dto.getJobcode() == null || "".equals(dto.getJobcode()))) {
querySql.append(" and Jobcode like '%" + dto.getJobcode() + "%'");
}
if (!(dto.getJobdesc() == null || "".equals(dto.getJobdesc()))) {
querySql.append(" and Jobdesc like '%" + dto.getJobdesc() + "%'");
}
if (!(dto.getJobclass() == null || "".equals(dto.getJobclass()))) {
querySql.append(" and Jobclass like '%" + dto.getJobclass()
+ "%'");
}
if (!(dto.getJobstatus() == null || "".equals(dto.getJobstatus()))) {
querySql.append(" and Jobstatus like '%" + dto.getJobstatus()
+ "%'");
}
if (!(dto.getCronexpression() == null || "".equals(dto
.getCronexpression()))) {
querySql.append(" and Cronexpression like '%"
+ dto.getCronexpression() + "%'");
}
querySql.append(" order by Schedule.Createdate) r ");
return scheduleDao.queryByPage(querySql.toString(), page, rows,
ScheduleDTO.class);
}
@Override
public List<?> qrySchedule() {
StringBuilder querySql = new StringBuilder(
"select Schedule.* from schedule Schedule");
List<?> list = scheduleDao.queryBysql(querySql.toString(),
ScheduleDTO.class);
return list;
}
@Override
public List<?> qryScheduleAll() {
List<?> list = scheduleDao
.queryBysql(
"select Schedule.* from schedule Schedule",
ScheduleDTO.class);
return list;
}
/**
* 获取任务调度对象
*/
@Override
@Transactional
public Schedule findSchedule(String jobCode) {
if (null != scheduleDao) {
return scheduleDao.get(Schedule.class, jobCode);
} else {
return template.get(Schedule.class, jobCode);
}
}
/**
* 启动定时任务
*
* @param jobCode
*/
@Override
@Transactional
public void startScheduleJob(String jobCode) {
try {
startJob(jobCode);
} catch (SchedulerException e) {
e.printStackTrace();
}
}
/**
* 停止定时任务
*
* @param jobCode
*/
@Override
@Transactional
public void stopScheduleJob(String jobCode) {
try {
stopJob(jobCode);
} catch (SchedulerException e) {
e.printStackTrace();
}
}
/**
* 启动任务调度引擎
*/
public static void startEngine() {
ScheduleServiceImp scheduleServiceImp = new ScheduleServiceImp();
scheduleServiceImp.startAllTask();
}
/**
* 启动所有的定时任务---系统启动的时候 由监听调用,不能自己调用
*/
@SuppressWarnings("unchecked")
@Transactional
public void startAllTask() {
// startJob
logger.info("开始启动定时任务======");
List<Schedule> list = null;
if (null != scheduleDao) {
list = (List<Schedule>) scheduleDao.queryByhsql(" from Schedule schedule");
} else {
template = (HibernateTemplate) BeanFactory.getBean("hibernateTemplate");
list = (List<Schedule>) template.find(" from Schedule schedule");
}
if (list != null && list.size() > 0) {
for (int i = 0; i < list.size(); i++) {
Schedule schedule = (Schedule) list.get(i);
String jobcode = null;
if (schedule.getJobstatus() == JOBSTATUS_RUNNING) {
try {
jobcode = schedule.getJobcode() == null ? null
: schedule.getJobcode();
if (jobcode == null) {
throw new Exception("任务启动失败");
}
this.startJob(jobcode);
logger.info("任务启动成功:" + jobcode);
} catch (Exception e) {
e.printStackTrace();
logger.error("任务启动失败:" + jobcode);
}
}
}
}
logger.info("启动定时任务结束==========");
}
/**
* 添加一个定时任务
*
* @param jobCode 任务名
* @param jobGroupName 任务组名
* @param triggerName 触发器名
* @param triggerGroupName 触发器组名
* @param jobClass 任务
* @param time 时间设置,参考quartz说明文档
* @param jobDesc
* @throws SchedulerException
* @throws ParseException
*/
@Transactional
public void addJob(String jobCode, String jobGroupName, String triggerName,
String triggerGroupName, String jobClass, String time,
String jobDesc) throws SchedulerException, ParseException {
scheduleAnJob(jobCode, jobGroupName, triggerName, triggerGroupName,
jobClass, time);
Schedule schedule = new Schedule();
schedule.setJobcode(jobCode);
schedule.setJobclass(jobClass);
schedule.setJobdesc(jobDesc);
schedule.setCronexpression(time);
schedule.setJobstatus(JOBSTATUS_RUNNING);
scheduleDao.save(schedule);
}
/**
* 将一个任务进行调度
*
* @param jobCode
* @param jobGroupName
* @param triggerName
* @param triggerGroupName
* @param jobClass
* @param time
* @throws SchedulerException
* @throws ParseException
*/
@SuppressWarnings({"unchecked"})
private void scheduleAnJob(String jobCode, String jobGroupName,
String triggerName, String triggerGroupName, String jobClass,
String time) throws SchedulerException, ParseException {
Class<Job> _class = null;
try {
_class = (Class<Job>) Class.forName(jobClass);
} catch (ClassNotFoundException e1) {
e1.printStackTrace();
}
// 初始化调度器
Scheduler sched = schedulerFactory.getScheduler();
// 设置作业,具体操作在SimpleJob类里
JobDetail jobDetail = JobBuilder.newJob(_class)
.withIdentity(jobCode, jobGroupName).build();
// 设置触发器 (0/20 * * * * ? : 每20秒执行一次 )
CronTrigger trigger = (CronTrigger) TriggerBuilder.newTrigger()
.withIdentity(triggerName, triggerGroupName)
.withSchedule(CronScheduleBuilder.cronSchedule(time)).build(); // 设置触发器
// 设置调度作业
sched.scheduleJob(jobDetail, trigger);
sched.start();
}
/**
* 修改一个任务的触发时间(使用默认的任务组名,触发器名,触发器组名)
*
* @param dto
* @throws SchedulerException
* @throws ParseException
*/
@Transactional
public void modifyJobTime(ScheduleDTO dto) throws SchedulerException,
ParseException {
String jobCode = dto.getJobcode();
String time = dto.getCronexpression();
Scheduler sched = schedulerFactory.getScheduler();
TriggerKey triggerKey = new TriggerKey(jobCode, TRIGGER_GROUP_NAME);
Trigger trigger = sched.getTrigger(triggerKey);
if (trigger != null) {
CronTriggerImpl ct = (CronTriggerImpl) trigger;
ct.setCronExpression(time);
sched.resumeTrigger(triggerKey);
Schedule schedule = findSchedule(jobCode);
Date date = new Date();
if (schedule != null) {
schedule.setCronexpression(time);
schedule.setJobclass(dto.getJobclass());
schedule.setJobdesc(dto.getJobdesc());
schedule.setModifydate(DateUtil.convertDate(date, DateUtil.YYYY_MM_DD));
schedule.setModifytime(DateUtil.convertDate(date, DateUtil.HHMMSS));
scheduleDao.update(schedule);
}
}
}
/**
* 删除一个任务(使用默认的任务组名,触发器名,触发器组名)
*
* @param jobCode
* @throws SchedulerException
*/
@Transactional
public void removeJob(String jobCode) throws SchedulerException {
Scheduler sched = schedulerFactory.getScheduler();
TriggerKey triggerKey = new TriggerKey(jobCode, TRIGGER_GROUP_NAME);
sched.pauseTrigger(triggerKey);// 停止触发器
sched.unscheduleJob(triggerKey);// 移除触发器
JobKey jobKey = new JobKey(jobCode, JOB_GROUP_NAME);
sched.deleteJob(jobKey);// 删除任务
Schedule schedule = new Schedule();
schedule.setJobcode(jobCode);
scheduleDao.remove(schedule);
}
/**
* 停止一个任务(使用默认的任务组名,触发器名,触发器组名)
*
* @param jobCode
* @throws SchedulerException
*/
@Transactional
public void stopJob(String jobCode) throws SchedulerException {
Scheduler sched = schedulerFactory.getScheduler();
TriggerKey triggerKey = new TriggerKey(jobCode, TRIGGER_GROUP_NAME);
sched.pauseTrigger(triggerKey);// 停止触发器
sched.unscheduleJob(triggerKey);// 移除触发器
JobKey jobKey = new JobKey(jobCode, JOB_GROUP_NAME);
sched.deleteJob(jobKey);// 删除任务
Schedule schedule = findSchedule(jobCode);
Date date = new Date();
if (schedule != null) {
schedule.setJobstatus(JOBSTATUS_STOPED);
schedule.setModifydate(DateUtil.convertDate(date, DateUtil.YYYY_MM_DD));
schedule.setModifytime(DateUtil.convertDate(date, DateUtil.HHMMSS));
scheduleDao.update(schedule);
}
}
/**
* 启动一个已经存在的任务(使用默认的任务组名,触发器名,触发器组名)
*
* @param jobCode
* @throws SchedulerException
*/
@Transactional
public void startJob(String jobCode) throws SchedulerException {
Scheduler sched = schedulerFactory.getScheduler();
TriggerKey triggerKey = new TriggerKey(jobCode, TRIGGER_GROUP_NAME);
sched.pauseTrigger(triggerKey);// 停止触发器
sched.unscheduleJob(triggerKey);// 移除触发器
JobKey jobKey = new JobKey(jobCode, JOB_GROUP_NAME);
sched.deleteJob(jobKey);// 删除任务
Date date = new Date();
Schedule schedule = findSchedule(jobCode);
if (schedule != null) {
schedule.setJobstatus(JOBSTATUS_RUNNING);
schedule.setModifydate(DateUtil.convertDate(date, DateUtil.YYYY_MM_DD));
schedule.setModifytime(DateUtil.convertDate(date, DateUtil.HHMMSS));
if (null != scheduleDao) {
scheduleDao.update(schedule);
// scheduleDao.excute("update schedule set jobstatus = '"+JOBSTATUS_RUNNING+"' where jobcode = '"+jobCode+"'");
} else {
Session session = template.getSessionFactory().openSession();
session.beginTransaction();
session.saveOrUpdate(schedule);
session.beginTransaction().commit();
session.clear();
session.close();
}
try {
scheduleAnJob(schedule.getJobcode(), JOB_GROUP_NAME, schedule.getJobcode(),
TRIGGER_GROUP_NAME, schedule.getJobclass(),
schedule.getCronexpression());
} catch (ParseException e) {
e.printStackTrace();
}
}
}
}
package com.sinosoft.service.impl;
import java.io.Serializable;
import java.text.ParseException;
import java.util.Date;
import java.util.List;
import javax.annotation.Resource;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.Session;
import org.quartz.CronScheduleBuilder;
import org.quartz.CronTrigger;
import org.quartz.Job;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.JobKey;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.TriggerKey;
import org.quartz.impl.StdSchedulerFactory;
import org.quartz.impl.triggers.CronTriggerImpl;
import org.springframework.orm.hibernate5.HibernateTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.sinosoft.common.BeanFactory;
import com.sinosoft.common.Page;
import com.sinosoft.dao.ScheduleDao;
import com.sinosoft.dto.ScheduleDTO;
import com.sinosoft.entity.Schedule;
import com.sinosoft.service.ScheduleService;
import com.sinosoft.util.DateUtil;
/**
* 任务调度工具类 需要执行调度的任务 需实现Job接口
*
* @author xushuyi
*/
@Service
public class ScheduleServiceImp implements ScheduleService {
private static Log logger = LogFactory.getLog(ScheduleServiceImp.class);
/**
* 任务状态运行
*/
public static final Integer JOBSTATUS_RUNNING = 1;
/**
* 任务状态停止
*/
public static final Integer JOBSTATUS_STOPED = 2;
/**
* 初始化任务调度器
*/
private SchedulerFactory schedulerFactory = new StdSchedulerFactory();
/**
* 默认的工作组
*/
private static String JOB_GROUP_NAME = "_default_job_group";
/**
* 默认的触发器组
*/
private static String TRIGGER_GROUP_NAME = "_default_trigger_group";
@Resource
private ScheduleDao scheduleDao;
/**
* hibernate事物模板
*/
private HibernateTemplate template = null;
/**
* 保存任务调度
*/
@Override
@Transactional
public Serializable saveSchedule(ScheduleDTO dto) {
try {
Date date = new Date();
Schedule schedule = new Schedule();
schedule.setJobcode(dto.getJobcode());
schedule.setJobclass(dto.getJobclass());
schedule.setJobdesc(dto.getJobdesc());
schedule.setCronexpression(dto.getCronexpression());
schedule.setJobstatus(dto.getJobstatus());
schedule.setCreatedate(DateUtil.convertDate(date, DateUtil.YYYY_MM_DD));
schedule.setCreatetime(DateUtil.convertDate(date, DateUtil.HHMMSS));
if (dto.getJobstatus() == 1) { //启用定时任务调度
scheduleAnJob(schedule.getJobcode(), JOB_GROUP_NAME, schedule.getJobcode(),
TRIGGER_GROUP_NAME, schedule.getJobclass(),
schedule.getCronexpression());
}
Serializable serializable = scheduleDao.save(schedule);
return serializable;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 更新任务调度
*/
@Override
@Transactional
public void updateSchedule(String id, ScheduleDTO dto) {
Scheduler sched;
try {
Date date = new Date();
sched = schedulerFactory.getScheduler();
TriggerKey triggerKey = new TriggerKey(StringUtils.trimToEmpty(dto.getJobcode()), TRIGGER_GROUP_NAME);
sched.pauseTrigger(triggerKey);// 停止触发器
sched.unscheduleJob(triggerKey);// 移除触发器
JobKey jobKey = new JobKey(StringUtils.trimToEmpty(dto.getJobcode()), JOB_GROUP_NAME);
sched.deleteJob(jobKey);// 删除任务
Schedule schedule = findSchedule(StringUtils.trimToEmpty(dto.getJobcode()));
if (schedule != null) {
schedule.setCronexpression(StringUtils.trimToEmpty(dto.getCronexpression()));
schedule.setJobdesc(dto.getJobdesc());
schedule.setJobstatus(dto.getJobstatus());
schedule.setJobclass(StringUtils.trimToEmpty(dto.getJobclass()));
schedule.setModifydate(DateUtil.convertDate(date, DateUtil.YYYY_MM_DD));
schedule.setModifytime(DateUtil.convertDate(date, DateUtil.HHMMSS));
if (dto.getJobstatus() == 1) { //启用定时任务调度
scheduleAnJob(schedule.getJobcode(), JOB_GROUP_NAME, schedule.getJobcode(),
TRIGGER_GROUP_NAME, schedule.getJobclass(),
schedule.getCronexpression());
}
scheduleDao.update(schedule);
}
} catch (SchedulerException e) {
e.printStackTrace();
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 删除批量定时任务调度
*/
@Override
@Transactional
public void deleteSchedules(String[] idArr) {
if (idArr != null && !"".equals(idArr)) {
scheduleDao.removes(idArr, Schedule.class);
}
}
/**
* 删除单个定时任务调度
*/
@Override
@Transactional
public void deleteSchedule(String jobcode) {
try {
removeJob(jobcode);
} catch (SchedulerException e) {
e.printStackTrace();
}
}
/**
* 分页查询定时任务调度
*/
@Override
public Page<?> qryScheduleOfPage(int page, int rows, ScheduleDTO dto) {
StringBuilder querySql = new StringBuilder(
"select r.* from (select Schedule.*,(case Schedule.jobstatus when 1 then '启用' else '停用' end ) jobstatusname from schedule Schedule where 1=1 ");
if (!(dto.getJobcode() == null || "".equals(dto.getJobcode()))) {
querySql.append(" and Jobcode like '%" + dto.getJobcode() + "%'");
}
if (!(dto.getJobdesc() == null || "".equals(dto.getJobdesc()))) {
querySql.append(" and Jobdesc like '%" + dto.getJobdesc() + "%'");
}
if (!(dto.getJobclass() == null || "".equals(dto.getJobclass()))) {
querySql.append(" and Jobclass like '%" + dto.getJobclass()
+ "%'");
}
if (!(dto.getJobstatus() == null || "".equals(dto.getJobstatus()))) {
querySql.append(" and Jobstatus like '%" + dto.getJobstatus()
+ "%'");
}
if (!(dto.getCronexpression() == null || "".equals(dto
.getCronexpression()))) {
querySql.append(" and Cronexpression like '%"
+ dto.getCronexpression() + "%'");
}
querySql.append(" order by Schedule.Createdate) r ");
return scheduleDao.queryByPage(querySql.toString(), page, rows,
ScheduleDTO.class);
}
@Override
public List<?> qrySchedule() {
StringBuilder querySql = new StringBuilder(
"select Schedule.* from schedule Schedule");
List<?> list = scheduleDao.queryBysql(querySql.toString(),
ScheduleDTO.class);
return list;
}
@Override
public List<?> qryScheduleAll() {
List<?> list = scheduleDao
.queryBysql(
"select Schedule.* from schedule Schedule",
ScheduleDTO.class);
return list;
}
/**
* 获取任务调度对象
*/
@Override
@Transactional
public Schedule findSchedule(String jobCode) {
if (null != scheduleDao) {
return scheduleDao.get(Schedule.class, jobCode);
} else {
return template.get(Schedule.class, jobCode);
}
}
/**
* 启动定时任务
*
* @param jobCode
*/
@Override
@Transactional
public void startScheduleJob(String jobCode) {
try {
startJob(jobCode);
} catch (SchedulerException e) {
e.printStackTrace();
}
}
/**
* 停止定时任务
*
* @param jobCode
*/
@Override
@Transactional
public void stopScheduleJob(String jobCode) {
try {
stopJob(jobCode);
} catch (SchedulerException e) {
e.printStackTrace();
}
}
/**
* 启动任务调度引擎
*/
public static void startEngine() {
ScheduleServiceImp scheduleServiceImp = new ScheduleServiceImp();
scheduleServiceImp.startAllTask();
}
/**
* 启动所有的定时任务---系统启动的时候 由监听调用,不能自己调用
*/
@SuppressWarnings("unchecked")
@Transactional
public void startAllTask() {
// startJob
logger.info("开始启动定时任务======");
List<Schedule> list = null;
if (null != scheduleDao) {
list = (List<Schedule>) scheduleDao.queryByhsql(" from Schedule schedule");
} else {
template = (HibernateTemplate) BeanFactory.getBean("hibernateTemplate");
list = (List<Schedule>) template.find(" from Schedule schedule");
}
if (list != null && list.size() > 0) {
for (int i = 0; i < list.size(); i++) {
Schedule schedule = (Schedule) list.get(i);
String jobcode = null;
if (schedule.getJobstatus() == JOBSTATUS_RUNNING) {
try {
jobcode = schedule.getJobcode() == null ? null
: schedule.getJobcode();
if (jobcode == null) {
throw new Exception("任务启动失败");
}
this.startJob(jobcode);
logger.info("任务启动成功:" + jobcode);
} catch (Exception e) {
e.printStackTrace();
logger.error("任务启动失败:" + jobcode);
}
}
}
}
logger.info("启动定时任务结束==========");
}
/**
* 添加一个定时任务
*
* @param jobCode 任务名
* @param jobGroupName 任务组名
* @param triggerName 触发器名
* @param triggerGroupName 触发器组名
* @param jobClass 任务
* @param time 时间设置,参考quartz说明文档
* @param jobDesc
* @throws SchedulerException
* @throws ParseException
*/
@Transactional
public void addJob(String jobCode, String jobGroupName, String triggerName,
String triggerGroupName, String jobClass, String time,
String jobDesc) throws SchedulerException, ParseException {
scheduleAnJob(jobCode, jobGroupName, triggerName, triggerGroupName,
jobClass, time);
Schedule schedule = new Schedule();
schedule.setJobcode(jobCode);
schedule.setJobclass(jobClass);
schedule.setJobdesc(jobDesc);
schedule.setCronexpression(time);
schedule.setJobstatus(JOBSTATUS_RUNNING);
scheduleDao.save(schedule);
}
/**
* 将一个任务进行调度
*
* @param jobCode
* @param jobGroupName
* @param triggerName
* @param triggerGroupName
* @param jobClass
* @param time
* @throws SchedulerException
* @throws ParseException
*/
@SuppressWarnings({"unchecked"})
private void scheduleAnJob(String jobCode, String jobGroupName,
String triggerName, String triggerGroupName, String jobClass,
String time) throws SchedulerException, ParseException {
Class<Job> _class = null;
try {
_class = (Class<Job>) Class.forName(jobClass);
} catch (ClassNotFoundException e1) {
e1.printStackTrace();
}
// 初始化调度器
Scheduler sched = schedulerFactory.getScheduler();
// 设置作业,具体操作在SimpleJob类里
JobDetail jobDetail = JobBuilder.newJob(_class)
.withIdentity(jobCode, jobGroupName).build();
// 设置触发器 (0/20 * * * * ? : 每20秒执行一次 )
CronTrigger trigger = (CronTrigger) TriggerBuilder.newTrigger()
.withIdentity(triggerName, triggerGroupName)
.withSchedule(CronScheduleBuilder.cronSchedule(time)).build(); // 设置触发器
// 设置调度作业
sched.scheduleJob(jobDetail, trigger);
sched.start();
}
/**
* 修改一个任务的触发时间(使用默认的任务组名,触发器名,触发器组名)
*
* @param dto
* @throws SchedulerException
* @throws ParseException
*/
@Transactional
public void modifyJobTime(ScheduleDTO dto) throws SchedulerException,
ParseException {
String jobCode = dto.getJobcode();
String time = dto.getCronexpression();
Scheduler sched = schedulerFactory.getScheduler();
TriggerKey triggerKey = new TriggerKey(jobCode, TRIGGER_GROUP_NAME);
Trigger trigger = sched.getTrigger(triggerKey);
if (trigger != null) {
CronTriggerImpl ct = (CronTriggerImpl) trigger;
ct.setCronExpression(time);
sched.resumeTrigger(triggerKey);
Schedule schedule = findSchedule(jobCode);
Date date = new Date();
if (schedule != null) {
schedule.setCronexpression(time);
schedule.setJobclass(dto.getJobclass());
schedule.setJobdesc(dto.getJobdesc());
schedule.setModifydate(DateUtil.convertDate(date, DateUtil.YYYY_MM_DD));
schedule.setModifytime(DateUtil.convertDate(date, DateUtil.HHMMSS));
scheduleDao.update(schedule);
}
}
}
/**
* 删除一个任务(使用默认的任务组名,触发器名,触发器组名)
*
* @param jobCode
* @throws SchedulerException
*/
@Transactional
public void removeJob(String jobCode) throws SchedulerException {
Scheduler sched = schedulerFactory.getScheduler();
TriggerKey triggerKey = new TriggerKey(jobCode, TRIGGER_GROUP_NAME);
sched.pauseTrigger(triggerKey);// 停止触发器
sched.unscheduleJob(triggerKey);// 移除触发器
JobKey jobKey = new JobKey(jobCode, JOB_GROUP_NAME);
sched.deleteJob(jobKey);// 删除任务
Schedule schedule = new Schedule();
schedule.setJobcode(jobCode);
scheduleDao.remove(schedule);
}
/**
* 停止一个任务(使用默认的任务组名,触发器名,触发器组名)
*
* @param jobCode
* @throws SchedulerException
*/
@Transactional
public void stopJob(String jobCode) throws SchedulerException {
Scheduler sched = schedulerFactory.getScheduler();
TriggerKey triggerKey = new TriggerKey(jobCode, TRIGGER_GROUP_NAME);
sched.pauseTrigger(triggerKey);// 停止触发器
sched.unscheduleJob(triggerKey);// 移除触发器
JobKey jobKey = new JobKey(jobCode, JOB_GROUP_NAME);
sched.deleteJob(jobKey);// 删除任务
Schedule schedule = findSchedule(jobCode);
Date date = new Date();
if (schedule != null) {
schedule.setJobstatus(JOBSTATUS_STOPED);
schedule.setModifydate(DateUtil.convertDate(date, DateUtil.YYYY_MM_DD));
schedule.setModifytime(DateUtil.convertDate(date, DateUtil.HHMMSS));
scheduleDao.update(schedule);
}
}
/**
* 启动一个已经存在的任务(使用默认的任务组名,触发器名,触发器组名)
*
* @param jobCode
* @throws SchedulerException
*/
@Transactional
public void startJob(String jobCode) throws SchedulerException {
Scheduler sched = schedulerFactory.getScheduler();
TriggerKey triggerKey = new TriggerKey(jobCode, TRIGGER_GROUP_NAME);
sched.pauseTrigger(triggerKey);// 停止触发器
sched.unscheduleJob(triggerKey);// 移除触发器
JobKey jobKey = new JobKey(jobCode, JOB_GROUP_NAME);
sched.deleteJob(jobKey);// 删除任务
Date date = new Date();
Schedule schedule = findSchedule(jobCode);
if (schedule != null) {
schedule.setJobstatus(JOBSTATUS_RUNNING);
schedule.setModifydate(DateUtil.convertDate(date, DateUtil.YYYY_MM_DD));
schedule.setModifytime(DateUtil.convertDate(date, DateUtil.HHMMSS));
if (null != scheduleDao) {
scheduleDao.update(schedule);
// scheduleDao.excute("update schedule set jobstatus = '"+JOBSTATUS_RUNNING+"' where jobcode = '"+jobCode+"'");
} else {
Session session = template.getSessionFactory().openSession();
session.beginTransaction();
session.saveOrUpdate(schedule);
session.beginTransaction().commit();
session.clear();
session.close();
}
try {
scheduleAnJob(schedule.getJobcode(), JOB_GROUP_NAME, schedule.getJobcode(),
TRIGGER_GROUP_NAME, schedule.getJobclass(),
schedule.getCronexpression());
} catch (ParseException e) {
e.printStackTrace();
}
}
}
}