美文网首页
maven项目使用quartz定时任务

maven项目使用quartz定时任务

作者: 码在路上 | 来源:发表于2018-07-10 15:47 被阅读0次

    quartz简介:

    Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用。Quartz可以用来创建简单或为运行十个,百个,甚至是好几万个Jobs这样复杂的程序。Jobs可以做成标准的Java组件或 EJBs。

    1. maven 依赖

    <dependency>
       <groupId>org.springframework</groupId>
       <artifactId>spring-context</artifactId>
       <version>3.1.1.RELEASE</version>
    </dependency>
    <dependency>
       <groupId>org.springframework</groupId>
       <artifactId>spring-context-support</artifactId>
       <version>3.1.1.RELEASE</version>
    </dependency>
    <dependency>
       <groupId>org.springframework</groupId>
       <artifactId>spring-tx</artifactId>
       <version>3.1.1.RELEASE</version>
    </dependency>
    <dependency>
       <groupId>org.springframework</groupId>
       <artifactId>spring-web</artifactId>
       <version>3.0.5.RELEASE</version>
    </dependency>
    <dependency>
       <groupId>org.quartz-scheduler</groupId>
       <artifactId>quartz</artifactId>
       <version>1.8.5</version>
    </dependency>
    

    2. 创建任务:

    任务创建:实现Job接口包含唯一的方法:

    public void execute(JobExecutionContext context) throws JobExecutionException{};

    编码 (QuartzJob.Java):
    package com.quartz;
    
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import org.quartz.Job;
    import org.quartz.JobDataMap;
    import org.quartz.JobExecutionContext;
    import org.quartz.JobExecutionException;
    /**
     * 任务执行类
     */
    public class QuartzJob implements Job {
    
    
        public void execute(JobExecutionContext content) throws JobExecutionException {
            System.out.println("任务开始时间:"+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
    
            String jobName = content.getJobDetail().getName();
            JobDataMap dataMap = content.getJobDetail().getJobDataMap();
            String param = dataMap.getString("param");
            System.out.println("传递的参数是="+param +"任务名字是="+jobName);
        }
    }
    

    3. 任务管理(添加任务,修改任务,删除任务)

    编码(QuartzManager.java):
    package com.quartz;
    
    
    import org.quartz.CronTrigger;
    import org.quartz.JobDetail;
    import org.quartz.Scheduler;
    import org.quartz.SchedulerFactory;
    import org.quartz.impl.StdSchedulerFactory;
    
    public class QuartzManager {
        private static SchedulerFactory gSchedulerFactory = new StdSchedulerFactory();
        private static String JOB_GROUP_NAME = "EXTJWEB_JOBGROUP_NAME";
        private static String TRIGGER_GROUP_NAME = "EXTJWEB_TRIGGERGROUP_NAME";
    
        /**
         * 添加一个定时任务,使用默认的任务组名,触发器名,触发器组名
         * @param jobName 任务名
         * @param cls 任务
         * @param time 时间设置
         */
        @SuppressWarnings("rawtypes")
        public static void addJob(String jobName, Class cls, String time) {
            try {
                Scheduler sched = gSchedulerFactory.getScheduler();
                // 任务名,任务组,任务执行类
                JobDetail jobDetail = new JobDetail(jobName, JOB_GROUP_NAME, cls);
                //可以传递参数
                jobDetail.getJobDataMap().put("param", "railsboy");
                // 触发器
                CronTrigger trigger = new CronTrigger(jobName, TRIGGER_GROUP_NAME);
                // 触发器名,触发器组
                trigger.setCronExpression(time);
                // 触发器时间设定
                sched.scheduleJob(jobDetail, trigger);
                // 启动
                if (!sched.isShutdown()) {
                    sched.start();
                }
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
        /**
         * 修改一个任务的触发时间(使用默认的任务组名,触发器名,触发器组名)
         * @param jobName
         * @param time
         */
        @SuppressWarnings("rawtypes")
        public static void modifyJobTime(String jobName, String time) {
            try {
                Scheduler sched = gSchedulerFactory.getScheduler();
                CronTrigger trigger = (CronTrigger) sched.getTrigger(jobName,TRIGGER_GROUP_NAME);
                if (trigger == null) {
                    return;
                }
                String oldTime = trigger.getCronExpression();
                if (!oldTime.equalsIgnoreCase(time)) {
                    JobDetail jobDetail = sched.getJobDetail(jobName,JOB_GROUP_NAME);
                    Class objJobClass = jobDetail.getJobClass();
                    removeJob(jobName);
                    addJob(jobName, objJobClass, time);
                }
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
    
    
        /**
         * 移除一个任务(使用默认的任务组名,触发器名,触发器组名)
         * @param jobName
         */
        public static void removeJob(String jobName) {
            try {
                Scheduler sched = gSchedulerFactory.getScheduler();
                sched.pauseTrigger(jobName, TRIGGER_GROUP_NAME);// 停止触发器
                sched.unscheduleJob(jobName, TRIGGER_GROUP_NAME);// 移除触发器
                sched.deleteJob(jobName, JOB_GROUP_NAME);// 删除任务
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
    
        /**
         * 启动所有定时任务
         */
        public static void startJobs() {
            try {
                Scheduler sched = gSchedulerFactory.getScheduler();
                sched.start();
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
    
        /**
         * 关闭所有定时任务
         */
        public static void shutdownJobs() {
            try {
                Scheduler sched = gSchedulerFactory.getScheduler();
                if (!sched.isShutdown()) {
                    sched.shutdown();
                }
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
    }
    
    

    4. 任务调度测试

    编码(QuartzTest.java):
    package com.quartz;
    
    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    public class QuartzTest {
        public static void main(String[] args) {
            try {
                String job_name = "动态任务调度";
                System.out.println("【任务启动】开始(每10秒输出一次)...");
                QuartzManager.addJob(job_name, QuartzJob.class, "0/10 * * * * ?");
                Thread.sleep(5000);
                System.out.println("【修改时间】开始(每2秒输出一次)...");
                QuartzManager.modifyJobTime(job_name, "10/2 * * * * ?");
                Thread.sleep(6000);
                System.out.println("【移除定时】开始...");
                QuartzManager.removeJob(job_name);
                System.out.println("【移除定时】成功");
                System.out.println("【再次添加定时任务】开始(每10秒输出一次)...");
                QuartzManager.addJob(job_name, QuartzJob.class, "*/10 * * * * ?");
                Thread.sleep(60000);
                System.out.println("【移除定时】开始...");
                QuartzManager.removeJob(job_name);
                System.out.println("【移除定时】成功");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        public static String formatDateByPattern(Date date, String dateFormat){
            SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
            String formatTimeStr = null;
            if (date != null) {
                formatTimeStr = sdf.format(date);
            }
            return formatTimeStr;
        }
        public static String getCron(java.util.Date  date){
            String dateFormat="ss mm HH dd MM ? yyyy";
            return formatDateByPattern(date, dateFormat);
        }
    }
    
    

    5. 补充

    Quartz有两大触发器,除了上面使用的SimpleTrigger外,就是CronTrigger。CronTrigger能够提供复杂的触发器表达式的支持。CronTrigger是基于Unix Cron守护进程,它是一个调度程序,支持简单而强大的触发器语法。

    使用CronTrigger主要的是要掌握Cron表达式。

    Cron表达式包含6个必要组件和一个可选组件,如下表所示。
    1.png
    特殊字符的含义,见下表。
    1DQM%GZJN`G~U$H(D2{4DUV.png
    常用 Cron表达式举例:
    "30 * * * * ?" 每半分钟触发任务
    "30 10 * * * ?" 每小时的10分30秒触发任务
    "30 10 1 * * ?" 每天1点10分30秒触发任务
    "30 10 1 20 * ?" 每月20号1点10分30秒触发任务
    "30 10 1 20 10 ? *" 每年10月20号1点10分30秒触发任务
    "30 10 1 20 10 ? 2011" 2011年10月20号1点10分30秒触发任务
    "30 10 1 ? 10 * 2011" 2011年10月每天1点10分30秒触发任务
    "30 10 1 ? 10 SUN 2011" 2011年10月每周日1点10分30秒触发任务
    "15,30,45 * * * * ?" 每15秒,30秒,45秒时触发任务
    "15-45 * * * * ?" 15到45秒内,每秒都触发任务
    "15/5 * * * * ?" 每分钟的每15秒开始触发,每隔5秒触发一次
    "15-30/5 * * * * ?" 每分钟的15秒到30秒之间开始触发,每隔5秒触发一次
    "0 0/3 * * * ?" 每小时的第0分0秒开始,每三分钟触发一次
    "0 15 10 ? * MON-FRI" 星期一到星期五的10点15分0秒触发任务
    "0 15 10 L * ?" 每个月最后一天的10点15分0秒触发任务
    "0 15 10 LW * ?" 每个月最后一个工作日的10点15分0秒触发任务
    "0 15 10 ? * 5L" 每个月最后一个星期四的10点15分0秒触发任务
    "0 15 10 ? * 5#3" 每个月第三周的星期四的10点15分0秒触发任务
    

    小节:(用到的知识多记录)谷歌,百度,自学之道,希望对你有帮助。

    相关文章

      网友评论

          本文标题:maven项目使用quartz定时任务

          本文链接:https://www.haomeiwen.com/subject/viofpftx.html