美文网首页Java
作业调度框架Quartz

作业调度框架Quartz

作者: 盗梦者_56f2 | 来源:发表于2020-02-28 17:45 被阅读0次

    Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目。

    核心概念

    • Job 表示一个工作,要执行的具体内容。
    • JobDetail 表示一个具体的可执行的调度程序,Job 是这个可执行的调度程序所要执行的内容,另外 JobDetail 还包含了这个任务调度的方案和策略。
    • JobBuilder 用于定义/构建JobDetail实例,用于定义作业的实例。
    • Trigger 代表一个调度参数的配置,什么时候去调。
    • TriggerBuilder 用于定义/构建触发器实例。
    • Scheduler 代表一个调度容器,一个调度容器中可以注册多个 JobDetail 和 Trigger。当 Trigger 与 JobDetail 组合,就可以被 Scheduler 容器调度了。

    例子

    import org.quartz.JobDetail;
    import org.quartz.Scheduler;
    import org.quartz.SchedulerFactory;
    import org.quartz.SimpleTrigger;
    import org.quartz.impl.StdSchedulerFactory;
    
    import static org.quartz.JobBuilder.*; 
    import static org.quartz.SimpleScheduleBuilder.*; 
    import static org.quartz.TriggerBuilder.*; 
    import static org.quartz.CronScheduleBuilder.*; 
    import static org.quartz.CalendarIntervalScheduleBuilder.*; 
    import static org.quartz.DateBuilder.*;
    
    public class QuartzTest {
    
          public static void main(String[] args) {
    
              try {
                  // 通过SchedulerFactory获取一个调度器实例
                SchedulerFactory schedulerFactory = new StdSchedulerFactory();
                Scheduler scheduler = schedulerFactory.getScheduler();
                // 调度启动
                scheduler.start();
                  // 创建一个JobDetail实例,指定DumbJob
                  JobDetail job = newJob(DumbJob.class)
                           .withIdentity("job1", "group1")
                           .usingJobData("jobSays", "Hello World!")
                           .usingJobData("myFloatValue", 3.141f)
                           .build();
    
                  // 通过SimpleTrigger定义调度规则:马上启动,每40秒运行一次
                  Trigger trigger = newTrigger()
                        .withIdentity("trigger1", "group1")
                        .startNow()
                        .withSchedule(simpleSchedule()
                        .withIntervalInSeconds(40)
                        .repeatForever())            
                        .build();
    
                  // 注册并进行调度
                  scheduler.scheduleJob(job, trigger);
                  //scheduler.shutdown();
    
              } catch (SchedulerException se) {
                  se.printStackTrace();
              }
          }
    }
    
    import java.util.Date;
    
    import org.quartz.Job;
    import org.quartz.JobExecutionContext;
    import org.quartz.JobExecutionException;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    public class DumbJob implements Job {
        private static Logger _log = LoggerFactory.getLogger(SimpleJob.class); 
        
        String jobSays;
        float myFloatValue;
        ArrayList state;
    
        public DumbJob() {
        }
        //实现Job接口方法
        public void execute(JobExecutionContext context) throws JobExecutionException {
          JobKey key = context.getJobDetail().getKey();
    
          JobDataMap dataMap = context.getMergedJobDataMap();  // Note the difference from the previous example
    
          state.add(new Date());
    
          System.err.println("Instance " + key + " of DumbJob says: " + jobSays + ", and val is: " + myFloatValue);
        }
    
        public void setJobSays(String jobSays) {
          this.jobSays = jobSays;
        }
    
        public void setMyFloatValue(float myFloatValue) {
          myFloatValue = myFloatValue;
        }
    
        public void setState(ArrayList state) {
          state = state;
        }
    
    }
    

    Triggers介绍

    最常用的两种trigger会分别是:SimpleTrigger和CronTrigger。
    SimpleTrigger可以满足的调度需求是:在具体的时间点执行一次,或者在具体的时间点执行,并且以指定的间隔重复执行若干次。比如,你有一个trigger,你可以设置它在2015年1月13日的上午11:23:54准时触发,或者在这个时间点触发,并且每隔2秒触发一次,一共重复5次。
    CronTrigger通常比Simple Trigger更有用,如果您需要基于日历的概念而不是按照SimpleTrigger的精确指定间隔进行重新启动的作业启动计划。使用CronTrigger,您可以指定号时间表,例如“每周五中午”或“每个工作日和上午9:30”,甚至“每周一至周五上午9:00至10点之间每5分钟”和1月份的星期五“。

    TriggerListeners、JobListeners、SchedulerListeners

    Listeners是您创建的对象,用于根据调度程序中发生的事件执行操作。
    trigger相关的事件包括:触发器触发,触发失灵,触发完成。
    job相关事件包括:job即将执行的通知,以及job完成执行时的通知。
    scheduler相关的事件包括:添加job/触发器,删除job/触发器,调度程序中的严重错误,关闭调度程序的通知等。

    jobstores

    JobStore负责跟踪您提供给调度程序的所有“工作数据”:jobs,triggers,日历等。
    RAMJobStore是使用最简单的JobStore,它也是性能最高的(在CPU时间方面)。RAMJobStore以其明显的方式获取其名称:它将其所有数据保存在RAM中。缺点是当您的应用程序结束(或崩溃)时,所有调度信息都将丢失
    JDBCJobStore也被恰当地命名 - 它通过JDBC将其所有数据保存在数据库中。

    相关文章

      网友评论

        本文标题:作业调度框架Quartz

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