Quartz-2.2.1 调度框架实现新增、修改、删除定时任务

如果需要对 Quartz 任务调度框架的相关 API 进行了解的,可以参看本篇相对简单的博客:

http://blog.csdn.net/hello_world_qwp/article/details/79021281

以下为 Java 项目中使用 Quartz-2.2.1 任务调度框架时,实现参数的传递,以及定时任务的 新增、修改、删除操作:

Job :

package com.etc.clear.data.job;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 定义导出数据任务
 * <p>
 * 
 * @ClassName : ExpDataJob
 *            </p>
 *            <p>
 * @Description : TODO
 *              </p>
 *              <p>
 * @Author : HuaZai
 *         </p>
 *         <p>
 * @ContactInformation : 1461522031@qq.com/huazai6789@aliyun.com
 *                     </p>
 * 
 * @Date : 2018年1月4日 下午4:05:10
 * @Version : V1.0.0
 *
 */
public class ExpDataJob implements Job {

    private static final Logger log = LoggerFactory.getLogger(ExpDataJob.class);

    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {

        log.info("============= 进入数据《导出》阶段 ...."+context.getJobDetail().getJobDataMap().getString("param"));
    }


}

Utils :

package com.etc.clear.data.utils;

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.SchedulerFactory;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.TriggerKey;
import org.quartz.impl.StdSchedulerFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.etc.clear.img.utils.ImgQuartzUtils;

/**
 * 数据任务调度工具类(增、刪、改、查)
 * <p>
 * 
 * @ClassName : DataQuartzUtils
 *            </p>
 *            <p>
 * @Description : TODO
 *              </p>
 *              <p>
 * @Author : HuaZai
 *         </p>
 *         <p>
 * @ContactInformation : 1461522031@qq.com/huazai6789@aliyun.com
 *                     </p>
 * 
 * @Date : 2018年1月5日 下午4:37:08
 * @Version : V1.0.0
 *
 */
public class DataQuartzUtils {

    // 定义变量
    private static final String JOB_GROUP_NAME = "JOB_DATAJOBGROUP_NAME"; // 任务组
    private static final String TRIGGER_GROUP_NAME = "TRIGGER_DATATRIGGERGROUP_NAME"; // 触发器组
    private static final Logger log = LoggerFactory.getLogger(ImgQuartzUtils.class);// 日志打印
    private static SchedulerFactory factory = new StdSchedulerFactory(); // 初始化调度容器

    /**
     * 新增定时任务
     * <p>
     * 
     * @Title : addJobToSecheduler
     *        </p>
     *        <p>
     * @Description : TODO
     *              </p>
     *              <p>
     * @Author : HuaZai
     *         </p>
     * 
     * @Date : 2018年1月10日 上午11:54:53
     */
    public static void addJobToSecheduler(String jobName, String triggerName, Class<? extends Job> jobClass,
            String cron) {
        try {

            // 通过SchedulerFactory工厂构建Scheduler容器对象
            Scheduler scheduler = factory.getScheduler();

            // 构建一个jobDetail 作业实例
            JobDetail detail = JobBuilder.newJob(jobClass) // 构建一个新任务
                    .withIdentity(jobName, JOB_GROUP_NAME) // 给新任务起名和分组
                    .build(); // 绑定作业

            // 通过 JobDataMap 实现参数传递
            detail.getJobDataMap().put("param", "huazai");

            // 构建一个 CronSchedule 的触发器
            Trigger trigger = TriggerBuilder.newTrigger()// 创建一个新的TriggerBuilder
                    .withIdentity(triggerName, TRIGGER_GROUP_NAME)// 给触发器起名和分组
                    .startNow()// 立即执行
                    .withSchedule(
                            // 定义触发规则
                            CronScheduleBuilder.cronSchedule(cron))
                    .build();// 绑定出发规则

            // 将job任务和trigger触发器添加到Scheduler容器中
            scheduler.scheduleJob(detail, trigger);

        } catch (Exception e) {
            e.printStackTrace();
            log.info(e.toString());
        }
    }

    /**
     * 修改一个任务的触发时间
     * <p>
     * 
     * @Title : updateJobToSecheduler
     *        </p>
     *        <p>
     * @Description : TODO
     *              </p>
     *              <p>
     * @Author : HuaZai
     *         </p>
     * 
     * @Date : 2018年1月10日 下午2:30:35
     */
    public static void updateJobToSecheduler(String jobName, String triggerName, String cron) {

        try {
            // 通过SchedulerFactory工厂构建Scheduler容器对象
            Scheduler scheduler = factory.getScheduler();

            // 获取指定任务的触发规则
            TriggerKey key = TriggerKey.triggerKey(triggerName, TRIGGER_GROUP_NAME);
            CronTrigger cronTrigger = (CronTrigger) scheduler.getTrigger(key);
            if (cronTrigger != null) {
                // 一、先在任务组中删除任务,再重新添加一个新的任务
               /*
               JobKey jobKey = JobKey.jobKey(jobName, JOB_GROUP_NAME);
               JobDetail jobDetail = scheduler.getJobDetail(jobKey); 
               Class<? extends Job> jobClass = jobDetail.getJobClass(); // 移除指定任务
               removeJobToScheduler(jobName, triggerName); // 新增任务
               addJobToSecheduler(jobName, triggerName, jobClass, cron);
               */


                // 二、重新构建一个触发器
                // 构建一个 CronSchedule 的触发器
                Trigger trigger = TriggerBuilder.newTrigger()// 创建一个新的TriggerBuilder
                        .withIdentity(triggerName, TRIGGER_GROUP_NAME)// 给触发器起名和分组
                        .startNow()// 立即执行
                        .withSchedule(
                                // 定义触发规则
                                CronScheduleBuilder.cronSchedule(cron))
                        .build();// 绑定出发规则
                // 调用 rescheduleJob 实现任务触发规则的重置
                scheduler.rescheduleJob(key, trigger);

            } else {
                log.info("============= 未找到修改对象  =============");
            }
        } catch (Exception e) {
            e.printStackTrace();
            log.info(e.toString());
        }
    }

    /**
     * 移除指定任务
     * <p>
     * 
     * @Title : removeJobToScheduler
     *        </p>
     *        <p>
     * @Description : TODO
     *              </p>
     *              <p>
     * @Author : HuaZai
     *         </p>
     * 
     * @Date : 2018年1月10日 下午3:30:56
     */
    public static void removeJobToScheduler(String jobName, String triggerName) {

        try {
            // 通过SchedulerFactory工厂构建Scheduler容器对象
            Scheduler scheduler = factory.getScheduler();
            TriggerKey triggerKey = TriggerKey.triggerKey(triggerName, TRIGGER_GROUP_NAME);

            // 注意:移除指定任务前,需要先停止,然后再从Scheduler容器中移除,最后在任务组中删除该任务
            scheduler.pauseTrigger(triggerKey);// 暂停触发器
            scheduler.unscheduleJob(triggerKey);// 移除触发器
            JobKey jobKey = JobKey.jobKey(jobName, JOB_GROUP_NAME);
            scheduler.deleteJob(jobKey);// 删除指定任务

            // 模拟数据处理
            Thread.sleep(3000);

        } catch (Exception e) {
            e.printStackTrace();
            log.info(e.toString());
        }
    }

    /**
     * 启动任务
     * <p>
     * 
     * @Title : startJobToScheduler
     *        </p>
     *        <p>
     * @Description : TODO
     *              </p>
     *              <p>
     * @Author : HuaZai
     *         </p>
     * 
     * @Date : 2018年1月10日 下午4:43:11
     */
    public static void startJobToScheduler() {
        try {
            // 通过SchedulerFactory工厂构建Scheduler容器对象
            Scheduler scheduler = factory.getScheduler();
            if (!scheduler.isShutdown()) {
                scheduler.start();// 启动任务
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 关闭任务
     * <p>
     * 
     * @Title : shutdowJobToScheduler
     *        </p>
     *        <p>
     * @Description : TODO
     *              </p>
     *              <p>
     * @Author : HuaZai
     *         </p>
     * 
     * @Date : 2018年1月10日 下午4:44:55
     */
    public static void shutdowJobToScheduler() {
        try {
            // 通过SchedulerFactory工厂构建Scheduler容器对象
            Scheduler scheduler = factory.getScheduler();
            scheduler.shutdown(true);// 关闭任务
            log.info("============= 任务关闭成功  =============");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

Commons :

package com.etc.clear.data.common;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.etc.clear.data.job.ExpDataJob;
import com.etc.clear.data.utils.DataQuartzUtils;

/**
 * 初始化数据清理任务
 * <p>
 * 
 * @ClassName : InitDataQuartzCommon
 *            </p>
 *            <p>
 * @Description : TODO
 *              </p>
 *              <p>
 * @Author : HuaZai
 *         </p>
 *         <p>
 * @ContactInformation : 1461522031@qq.com/huazai6789@aliyun.com
 *                     </p>
 * 
 * @Date : 2018年1月4日 下午3:45:09
 * @Version : V1.0.0
 *
 */
public class InitDataQuartzCommon {

    private static String JOB_NAME = "ExpDataJob";
    private static String TRIGGER_NAME = "ExpDataTrigger";
    private static String EXP_DATA_CRON_START = "0/3 * * * * ?";
    private static String EXP_DATA_CRON_UPDATE = "0/5 * * * * ?";
    private static Logger log = LoggerFactory.getLogger(InitDataQuartzCommon.class);

    /**
     * 初始化数据清除任务
     * <p>
     * 
     * @Title : startClearData
     *        </p>
     *        <p>
     * @Description : TODO
     *              </p>
     *              <p>
     * @Author : HuaZai
     *         </p>
     * 
     * @Date : 2018年1月10日 下午5:00:09
     */
    public void startClearData() {

        try {

            log.info("============= 构建并添加新任务  =============");
            DataQuartzUtils.addJobToSecheduler(JOB_NAME, TRIGGER_NAME, ExpDataJob.class, EXP_DATA_CRON_START);

            log.info("============= 启动定时任务  =============");
            DataQuartzUtils.startJobToScheduler();

            Thread.sleep(9000);// 模拟数据处理时间

            log.info("============= 修改任务时间  =============");
            DataQuartzUtils.updateJobToSecheduler(JOB_NAME, TRIGGER_NAME, EXP_DATA_CRON_UPDATE);

            Thread.sleep(10000);// 模拟数据处理时间

            log.info("============= 移除定时任务  =============");
            DataQuartzUtils.removeJobToScheduler(JOB_NAME, TRIGGER_NAME);

            log.info("============= 关闭定时任务  =============");
            DataQuartzUtils.shutdowJobToScheduler();

            Thread.sleep(5000);// 模拟关闭定时器

            log.info("============= 任务周期结束  =============");

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Main :

package com.etc.clear;

import com.etc.clear.data.common.InitDataQuartzCommon;

/**
 * 程序启动入口/调用任务的类
 * <p>
 * 
 * @ClassName : ClsMain
 *            </p>
 *            <p>
 * @Description : TODO
 *              </p>
 *              <p>
 * @Author : HuaZai
 *         </p>
 *         <p>
 * @ContactInformation : 1461522031@qq.com/huazai6789@aliyun.com
 *                     </p>
 * 
 * @Date : 2018年1月3日 下午1:21:56
 * 
 * @Version : V1.0.0
 *
 */
public class ApplicationMain {

    public static void main(String[] args) {

        // 初始化清理数据任务
        InitDataQuartzCommon dataQuartzCommon = new InitDataQuartzCommon();
        // 启动数据清理任务
         dataQuartzCommon.startClearData();

    }

}

运行效果如下图:
这里写图片描述

本实例源码下载地址:
http://download.csdn.net/download/hello_world_qwp/10208195

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值