zoukankan      html  css  js  c++  java
  • quartz基本介绍

    • Quartz基本介绍

      • 简介

        Quartz是一个功能强大的开源任务调度框架,几乎可以继承到任何java应用程序。Quartz可以用来创建简单或为运行十个,百个,甚至是好几万个Jobs这样复杂的程序。同时Quartz Scheduler包含许多企业级功能,例如对JTA事务和集群的支持

      • 简单实例

        该实例用来在下一分钟执行一个helloJob

        public class HelloJobMain {
        
            public static void main(String[] args) throws Exception {
              //  DirectSchedulerFactory directSchedulerFactory =  DirectSchedulerFactory.getInstance();
        
                //创建一个调度工厂对象,并从里面获取一个调度器
                SchedulerFactory schedulerFactory = new StdSchedulerFactory();
                Scheduler scheduler = schedulerFactory.getScheduler();
        
        
                //获取当前时间的下一分钟
                Date runTime = DateBuilder.evenMinuteDate(new Date());
                //定义一个job jobkey名称 jobkey 组
                JobDetail job = JobBuilder.newJob(HelloJob.class).withIdentity("job1", "group1").build();
        
                JobDataMap jobDataMap = job.getJobDataMap();
                //JobDataMap jobDataMap=new JobDataMap();
                jobDataMap.put("zhangsan",23);
        
                //定义一个定时器
                Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1").startAt(runTime).build();
        
                scheduler.getContext().put("lisi",24);
        
                scheduler.scheduleJob(job, trigger);
        
                scheduler.start();
        
        
                Thread.sleep(65L * 1000L);
        
                scheduler.shutdown(true);
        
            }
        }
        
        
        public class HelloJob implements Job {
            /**
             * @param jobExecutionContext
             * @throws JobExecutionException
             */
            @Override
            public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
                System.out.println("HelloJob 任务执行啦");
        
                JobDetail jobDetail = jobExecutionContext.getJobDetail();
                JobKey key = jobDetail.getKey();
                Trigger trigger = jobExecutionContext.getTrigger();
                TriggerKey key1 = trigger.getKey();
        
                JobDataMap mergedJobDataMap = jobExecutionContext.getMergedJobDataMap();
                System.out.println(mergedJobDataMap.get("zhangsan"));
        
                SchedulerContext context = null;
                try {
                    context = jobExecutionContext.getScheduler().getContext();
                } catch (SchedulerException e) {
                    e.printStackTrace();
                }
                System.out.println(context.get("lisi"));
        
        
            }
        }
        

        上面代码是创建一个Job的基本步骤,即包括:

        1、创建SchedulerFactory工厂对象,并从中获取一个Scheduler

        2、创建一个JobDetail

        3、创建一个触发器即Trigger

        4、注册到Scheduler,即scheduler.scheduleJob(job, trigger);

        5、启动Scheduler,即scheduler.start();

      • 核心类与接口

        Job:是一个接口,里面有一个方法public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException,开发者在开发调度任务的时候,只需要实现该接口即可。JobExecutionContext类提供了调度上下文的各种信息。Job运行时的信息保存在JobDataMap,也可以保存在SchedulerContext中。

        JobDetail:传递给定Job实例的详细信息,包括Job名字以及所属的组

        Trigger:触发Job执行的时间的规则。主要有CalendarIntervalTrigger,CronTrigger,DailyTimeIntervalTrigger,SimpleTrigger,常用的有SimpleTrigger和CronTrigger两个。

        ​ CalendarIntervalTrigger:按照固定的时间间隔来触发任务。比如:使用月作为间隔单位,不小心设置为月底的最后一天,比如1月31号,Trigger的Unit为month,interval是1,则下一个触发为2月28号,之后再次触发为3月28号,依次类推。

        ​ DailyTimeIntervalTrigger:跟CalendarIntervalTrigger类似,比如:Trigger设置在8:00~11:00之间,每72分钟执行一次,则执行时间为8:00, 9:12, 10:24,下次执行时间为第二天的8:00, 9:12, 10:24。

        ​ CronTrigger:按照Cron表达式给定的时间触发任务

        ​ SimpleTrigger:用来触发只需执行一次或者在给定时间触发并且重复N次且每次执行延迟一定时间的任务。

        Scheduler:代表一个Quartz的独立运行容器,Trigger和JobDetail可以注册到Scheduler中,两者在Scheduler中拥有各自的组及名称,组及名称是Scheduler查找定位容器中某一对象的依据,Trigger的组及名称必须唯一,JobDetail的组和名称也必须唯一(但可以和Trigger的组和名称相同,因为它们是不同类型的)。Scheduler定义了多个接口方法,允许外部通过组及名称访问和控制容器中Trigger和JobDetail。

        ThreadPool:Scheduler使用一个线程池作为任务运行的基础设施,任务通过共享线程池中的线程提高运行效率。
        JobStore: 通过类实现的接口,这些类要为org.quartz.core.QuartzScheduler的使用提供一个org.quartz.Job和org.quartz.Trigger存储机制。作业和触发器的存储应该以其名称和组的组合为唯一性。
        QuartzSchedulerResources:包含创建QuartzScheduler实例所需的所有资源(JobStore,ThreadPool等)。
        SchedulerFactory :提供用于获取调度程序实例的客户端可用句柄的机制
        QuartzSchedulerThread:负责执行向QuartzScheduler注册的触发Trigger的工作的线程。

      • Cron表达式

        结构: corn从左到右(用空格隔开):秒 分 小时 月份中的日期 月份 星期中的日期 年份

        字段 允许值 允许特殊字符
        Seconds 0-59 , - * /
        Minutes 0-59 , - * /
        Hours 0-23 , - * /
        Day-of-month 1-31 , - * ? / L W
        Month 0-11 or JAN-DEC , - * /
        Day-of-Week 1-7 or SUN-SAT , - * ? / L #
        Year (Optional) empty, 1970-2199 , - * /

        *号:代表任意的值,比如:在minutes代表任意每一分钟

        ?号:用于day-of-month 和 day-of-week,表示不匹配任何值

        -号:比如用在hour字段,10-12 表示匹配10,11,12

        ,号:表示枚举值,比如在day-of-week:MON,WED,FRI代表Monday, Wednesday, 和Friday

        /号: 表示起始时间开始触发,然后每隔固定时间触发一次。例如在Minutes域使用5/20,则意味着5分钟触发一次,而25,45等分别触发一次.

        L号:表示最后,用在day-of-month 和day-of-week, 如果在day-of-week域使用5L,意味着在最后的一个星期四触发。

        W号:表示有效工作日(周一到周五),只能出现在DayofMonth域,系统将在离指定日期的最近的有效工作日触发事件。例如:在 DayofMonth使用5W,如果5日是星期六,则将在最近的工作日:星期五,即4日触发。如果5日是星期天,则在6日(周一)触发;如果5日在星期一到星期五中的一天,则就在5日触发。另外一点,W的最近寻找不会跨过月份 。

        LW号:这两个字符可以连用,表示在某个月最后一个工作日,即最后一个星期五。

        #号:用于确定每个月第几个星期几,只能出现在DayofMonth域。例如在4#2,表示某月的第二个星期三。

        表达式 含义
        0 0 12 * * ? 表示每天12点执行
        0 15 10 ? * * 每天10:15am执行
        0 15 10 * * ? 每天10:15am执行
        0 15 10 * * ? * 每天10:15am执行
        0 15 10 * * ? 2005 2005年每天10:15am执行
        0 * 14 * * ? 每天从2:00pm到2:59pm每分钟执行
        0 0/5 14 * * ? 每天从2:00pm到2:59pm每5分钟执行
        0 0/5 14,18 * * ? 每天2:00pm到2:59pm和6:00pm到6:59pm,每5分钟执行一次
        0 0-5 14 * * ? 每天2:00pm到2:05pm每分钟执行
        0 10,44 14 ? 3 WED 每年三月的星期三的下午2:10和2:44触发
        0 15 10 ? * MON-FRI 周一至周五的上午10:15触发
        0 15 10 15 * ? 每月15日上午10:15触发
        0 15 10 L * ? 每月最后一日的上午10:15触发
        0 15 10 ? * 6L 每月的最后一个星期五上午10:15触发
        0 15 10 ? * 6L 2002-2005 2002年至2005年的每月的最后一个星期五上午10:15触发
        0 15 10 ? * 6#3 每月的第三个周五上午10:15触发

    相关源码参考: https://github.com/albert-liu435/springquartz

  • 相关阅读:
    Windows下升级Zabbix Agent
    mariadb+haproxy实现负载均衡(一)
    mariadb数据库galera下添加新的服务器节点
    1044/1045
    mariadb 离线安装
    CentSO7.6下部署Maridb Galera Cluster 实践记录(一)
    Word 远程调用失败:异常来自 HRESULT:0x800706BE
    CentSO7.6下部署Maridb Galera Cluster 实践记录(二)
    数据结构之双向链表-c语言实现
    数据结构之单链表-c语言实现
  • 原文地址:https://www.cnblogs.com/haizhilangzi/p/10914085.html
Copyright © 2011-2022 走看看