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(); } } } }