zoukankan      html  css  js  c++  java
  • Quartz调度使用总结

    官网文档:http://www.quartz-scheduler.org/documentation/quartz-2.2.x/quick-start.html

    1、安装

    1.1、安装

    1、如果你使用maven,你可以在你的项目中添加dependencies,具体如下:

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

    2、如果不是maven,你可以下载quartz相关包,导入到自己的工程中

    1.2、配置

    quartz是一个非常可配置的应用,默认quartz默认是加载quartz.properties文件,如果你想配置quartz,在项目的classpath中加入quartz.properties,但这个文件不是必须的,如果你只使用quartz的默认配置,不添加任何配置,这个文件可以不加入自己的项目中。

    为了项目运行更优,你可以配置一些基本的东西,例如:

    org.quartz.scheduler.instanceName = MyScheduler
    org.quartz.threadPool.threadCount = 3
    org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore
    • org.quartz.scheduler.instanceName----调度的名称
    • org.quartz.threadPool.threadCount-----线程池中有3个线程,这就意味着最多有3个作业同时运行
    • org.quartz.jobStore.class -------所有调度任务的数据(例如job和trigger的信息),保存在RAM(内存)中,而不是数据库中。RAMJobStore 是使用最简单的也是最高效(依据CPU时间)的JobStore。缺点是你的应用结束之后所有的数据也丢失了--这意味着RAMJobStore 不具有保持job和trigger持久的能力。对于一些程序是可以接受的,甚至是期望的,但对于其他的程序可能是灾难性的。

    2、quartz的使用

    2.1、examples

    示例一:

      quartz安装后,下面举一些例子来说明quartz如何启动、关闭调度的。

    import org.quartz.Scheduler;
    import org.quartz.SchedulerException;
    import org.quartz.impl.StdSchedulerFactory;
    import static org.quartz.JobBuilder.*;
    import static org.quartz.TriggerBuilder.*;
    import static org.quartz.SimpleScheduleBuilder.*;
    
    public class QuartzTest {
    
      public static void main(String[] args) {
    
          try {
              // Grab the Scheduler instance from the Factory
              Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
    
              // 调度启动
              scheduler.start();
    
              // 调度关闭
              scheduler.shutdown();
    
          } catch (SchedulerException se) {
              se.printStackTrace();
          }
      }
    }

    注:如果使用StdSchedulerFactory.getDefaultScheduler()启动调度程序,应用程序不会终止,知道调度器执行.shutdown(),因为它是一个激活的线程。

    在start()和shutdown()之间,你可以加一些Job和trigger,如下:

    //定义Job,并将Job绑定到HelloJob.class类上,即当一个Job启动后,HelloJob.class里封装了Job的处理逻辑
    JobDetail job = newJob(HelloJob.class)
      .withIdentity("job1", "group1")
      .build();
    
    
    //定时启动Job,每40s重复一次
    Trigger trigger = newTrigger()
      .withIdentity("trigger1", "group1")
      .startNow()
            .withSchedule(simpleSchedule()
              .withIntervalInSeconds(40)
              .repeatForever())            
      .build();
    
    
    //告诉quartz用我们自定义的trigger调度Job
    scheduler.scheduleJob(job, trigger);

    示例二:

    基于基于Quartz 2.2.1一个简单的示例

    package com.test.quartz;
    
    import static org.quartz.DateBuilder.newDate;
    import static org.quartz.JobBuilder.newJob;
    import static org.quartz.SimpleScheduleBuilder.simpleSchedule;
    import static org.quartz.TriggerBuilder.newTrigger;
    
    import java.util.GregorianCalendar;
    
    import org.quartz.JobDetail;
    import org.quartz.Scheduler;
    import org.quartz.Trigger;
    import org.quartz.impl.StdSchedulerFactory;
    import org.quartz.impl.calendar.AnnualCalendar;
    
    public class QuartzTest {
    
        public static void main(String[] args) {
            try {
                //创建scheduler
                Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
    
                //定义一个Trigger
                Trigger trigger = newTrigger().withIdentity("trigger1", "group1") //定义name/group
                    .startNow()//一旦加入scheduler,立即生效
                    .withSchedule(simpleSchedule() //使用SimpleTrigger
                        .withIntervalInSeconds(1) //每隔一秒执行一次
                        .repeatForever()) //一直执行,奔腾到老不停歇
                    .build();
    
                //定义一个JobDetail
                JobDetail job = newJob(HelloQuartz.class) //定义Job类为HelloQuartz类,这是真正的执行逻辑所在
                    .withIdentity("job1", "group1") //定义name/group
                    .usingJobData("name", "quartz") //定义属性
                    .build();
    
                //加入这个调度
                scheduler.scheduleJob(job, trigger);
    
                //启动之
                scheduler.start();
    
                //运行一段时间后关闭
                Thread.sleep(10000);
                scheduler.shutdown(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    package com.test.quartz;
    
    import java.util.Date;
    
    import org.quartz.DisallowConcurrentExecution;
    import org.quartz.Job;
    import org.quartz.JobDetail;
    import org.quartz.JobExecutionContext;
    import org.quartz.JobExecutionException;
    
    public class HelloQuartz implements Job {
        public void execute(JobExecutionContext context) throws JobExecutionException {
            JobDetail detail = context.getJobDetail();
            String name = detail.getJobDataMap().getString("name");
            System.out.println("say hello to " + name + " at " + new Date());
        }
    }

    这个例子很好的覆盖了Quartz最重要的3个基本要素:

    • Scheduler:调度器。所有的调度都是由它控制。
    • Trigger: 定义触发的条件。例子中,它的类型是SimpleTrigger,每隔1秒中执行一次(什么是SimpleTrigger下面会有详述)。
    • JobDetail & Job: JobDetail 定义的是任务数据,而真正的执行逻辑是在Job中,例子中是HelloQuartz。 为什么设计成JobDetail + Job,不直接使用Job?这是因为任务是有可能并发执行,如果Scheduler直接使用Job,就会存在对同一个Job实例并发访问的问题。而JobDetail & Job 方式,sheduler每次执行,都会根据JobDetail创建一个新的Job实例,这样就可以规避并发访问的问题。

    官网示例:http://www.quartz-scheduler.org/documentation/quartz-2.2.x/examples/

    2.2、API

    使用quartz时,我们往往需要根据自己的业务来添加一些quartz策略,了解quartz的API很重要。

     Quartz API 关键的几个接口:

    • Scheduler:跟任务调度相关的最主要的API接口。
    • Job:你期望任务调度执行的组件定义(调度器执行的内容),都必须实现该接口。
    • JobDetail:用来定义Job的实例。
    • Trigger:定义一个指定的Job何时被执行的组件,也叫触发器。
    • JobBuilder:用来定义或创建JobDetail的实例,JobDetail限定了只能是Job的实例。
    • TriggerBuilder:用来定义或创建触发器的实例。

    下面针对quartz关键的接口,进行一些整理

    关于Scheduler

    关于Job和JobDetail

    关于Trigger

    关于JobStore

     

  • 相关阅读:
    springmvc 项目完整示例08 前台页面以及知识点总结
    springmvc 项目完整示例07 设置配置整合springmvc springmvc所需jar包springmvc web.xml文件配置
    springmvc 项目完整示例06 日志–log4j 参数详细解析 log4j如何配置
    springmvc 项目完整示例05 日志 --log4j整合 配置 log4j属性设置 log4j 配置文件 log4j应用
    springmvc 项目完整示例04 整合mybatis mybatis所需要的jar包 mybatis配置文件 sql语句 mybatis应用
    springmvc 项目完整示例03 小结
    springmvc 项目完整示例02 项目创建-eclipse创建动态web项目 配置文件 junit单元测试
    springmvc 项目完整示例01 需求与数据库表设计 简单的springmvc应用实例 web项目
    spring原理案例-基本项目搭建 03 创建工程运行测试 spring ioc原理实例示例
    spring原理案例-基本项目搭建 01 spring framework 下载 官网下载spring jar包
  • 原文地址:https://www.cnblogs.com/lyftest/p/9100062.html
Copyright © 2011-2022 走看看