Java

作业调度框架Quartz

2020-02-28  本文已影响0人  盗梦者_56f2

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

核心概念

例子

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将其所有数据保存在数据库中。

上一篇下一篇

猜你喜欢

热点阅读