zoukankan      html  css  js  c++  java
  • Quartz任务调度

    一、基本概念

    在java中,可以通过Quatz框架来实现定时任务。

    Quartz主要包括以下部分:

    1.scheduler:调度器,可以把任务和触发器注册到任务调度器中,然后启动调度器。

    2.Trigger :触发器,包括SimpleTrigger和CronTrigger。CronTrigger可以实现复杂的触发条件。
    3.JobDetail :  定义的是任务数据,而真正的执行逻辑是在Job中
    4.Job :任务接口,通过实现该接口,在execute()方法中实现定时的任务,也就是业务逻辑。

    二、代码演示

    首先,在maven中导入依赖,如下所示:

    <dependency>
        <groupId>org.quartz-scheduler</groupId>
        <artifactId>quartz</artifactId>
        <version>2.2.1</version>
    </dependency>

    示例代码如下:

    QuartzJob.java如下:

    import org.quartz.Job;
    import org.quartz.JobExecutionContext;
    import org.quartz.JobExecutionException;
    
    import java.util.Date;
    
    public class QuartzJob implements Job {
        @Override
        public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
            System.out.println(new Date());
    
        }
    }

    如下所示:

    import org.quartz.*;
    import org.quartz.impl.StdSchedulerFactory;
    
    import static org.quartz.JobBuilder.newJob;
    import static org.quartz.SimpleScheduleBuilder.simpleSchedule;
    import static org.quartz.TriggerBuilder.newTrigger;
    
    public class QuartzScheduling {
        public static void main(String[] args) throws SchedulerException, InterruptedException {
            SchedulerFactory schedulerFactory=new StdSchedulerFactory();
            //创建scheduler,也即调度器
            Scheduler scheduler=schedulerFactory.getScheduler();
            //定义一个JobDetail,定义的是任务数据,而真正的执行逻辑是在Job中
            JobDetail jobDetail=newJob(QuartzJob.class)
                    .withIdentity("QuartzJob")
                    .build();
            //定义一个Trigger,也就是定义触发的条件。
            Trigger  trigger=newTrigger()
                       .withIdentity("simpleTrigger")                        // 定义name,这里还可以定义group
                       .withSchedule(    simpleSchedule()
                                         .withIntervalInSeconds( 2 )         //每隔2 秒执行一次
                                         .repeatForever() )               //一直执行,永不停止
                       .startAt( DateBuilder.futureDate(2, DateBuilder.IntervalUnit.SECOND )  )     //接下来的2秒执行
                      .build();
            // 把任务和触发器注册到任务调度器中
            scheduler.scheduleJob(jobDetail  , trigger);
            //启动任务调度器
            scheduler.start();
            //运行一段时间后关闭
            Thread.sleep(10*1000);
            scheduler.shutdown(true);
        }
    }

      以上代码中使用的触发器是simpleTrigger,如果要求的触发条件比较复杂,可以使用cronTrigger,

     以下这个触发器表示的是每天的12点15分、30分触发。

     //定义一个Trigger,也就是定义触发的条件。
    Trigger trigger = TriggerBuilder.newTrigger().withIdentity("cronTrigger")
                       .withSchedule(CronScheduleBuilder.cronSchedule("0 15,30 12 * * ?"))     
                        .startNow() 
                        .build();

    CronScheduleBuilder.cronSchedule()里面的表达式依次表示      [秒] [分] [小时] [日] [月] [周] [年]

    其中,表达式中的特殊符号的意义是:

        “*” 代表这个时间单位的整个时间段.比如 *放在秒上面,就是指任意秒,*放在分上面就是任意分。

                   “?”字符:表示不确定的值(注意:? 号只能用在日和周域上,但是不能在这两个域上同时使用。假如你为这两域的其中一个指定了值,那就必须在另一个字值上放一个 ?,如:0 0 0 * * ?)

                   “,”字符:指定数个值

                   “-”字符:指定一个值的范围

                   “/”字符:指定一个值的增加幅度。n/m表示从n开始,每次增加m

                   “L”字符:用在日表示一个月中的最后一天,用在周表示该月最后一个星期X

                   “W”字符:指定离给定日期最近的工作日(周一到周五)

                   “#”字符:表示该月第几个周X。5#2表示该月第2个周四(每周的第一天是从周日开始的,即:周日的值为:1)

    简单的使用 Cron 的示例如下:

    常见的Cron

    每隔5秒执行一次:*/5 * * * * ?
    每隔1分钟执行一次:0 */1 * * * ?

    其他的示例:

    在每个周一,二, 三和周四的 10:15 AM 0 15 10 ? * MON-FRI
    每月10号的 10:15 AM   0 15 10 10 * ?
    每月最后一天的 10:15 AM 0 15 10 L * ?
    每月最后一个周五的 10:10 AM  0 10 10 ? * 6L
    在 2014, 2015, 2016, 和 2017 年中的每月最后一个周五的 10:10 AM  0 10 10 ? * 6L 2014-2017
    每月第三个周五的 10:15 AM 0 15 10 ? * 6#3
    每月从第一天算起每五天的 12:00 PM (中午) 0 0 12 1/5 * ?
    每一个 11 月 11 号的 11:11 AM 0 11 11 11 11 ?
    三月份每个周三的 2:10 PM 和 2:44 PM 0 10,44 14 ? 3 WED

    * 详情参考博客:

    https://www.cnblogs.com/drift-ice/p/3817269.html

    https://blog.csdn.net/woniu211111/article/category/7693137

    https://www.cnblogs.com/gaoqing/p/3651106.html

  • 相关阅读:
    List<Map>中根据某个属性去重,不重复的值则覆盖null
    Jenkins的Master-Slave分布式构建
    Jenkins+Docker+SpringCloud微服务持续集成(集群版)
    Jenkins+Docker+SpringCloud微服务持续集成(单机版)
    Jenkins持续集成实战
    Python面向对象总结
    Python监控Redis脚本
    SnmpWalk获取服务器状态信息
    xclarity
    CNware
  • 原文地址:https://www.cnblogs.com/expiator/p/9038677.html
Copyright © 2011-2022 走看看