JAVA编码(68)—— 任务调度Quartz(项目实例)

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

 

posted @ 2018-05-07 14:45  xu_shuyi  阅读(383)  评论(0)    收藏  举报