Quartz基本使用

2018-06-18 03:26:17来源:未知 阅读 ()

新老客户大回馈,云服务器低至5折

1.Quartz概述:简单的说就是java的一个定时任务的框架,没有那么复杂的解释,跟前端的定时器一样。在了解它之前,首先熟悉几个概念。

2.基本概念

2.1 Job:表示一个工作,要执行的具体内容。此接口中只有一个方法      void execute(JobExecutionContext context)

2.2 JobDetail:JobDetail 表示一个具体的可执行的调度程序, Job 是这个可执行程调度程序所要执行的内容,另外 JobDetail 还包含了这个任务调度的方案和策略。

2.3 Trigger 代表一个调度参数的配置,什么时候去调。

2.4  Scheduler 代表一个调度容器,一个调度容器中可以注册多个 JobDetail 和 Trigger。当Trigger 与 JobDetail 组合,就可以被 Scheduler 容器调度了。

解释:
l 编写 job 实现业务,要做什么具体事情问题。
l 使用 JobDetail 包装 job,是任务对象,可以被调度
l 使用 Trigger (触发器对象)定制什么时候去调用某任务对象。
l 使用 Scheduler 结合任务对象和触发器对象,很像一个大管家。

3.运行原理

下面实例:开启大管家,启动,关闭

引入相应的jar包

  <dependencies>
        <dependency>
            <groupId>org.quartz-scheduler</groupId>
            <artifactId>quartz</artifactId>
            <version>2.2.3</version>
        </dependency>
        <dependency>
            <groupId>org.quartz-scheduler</groupId>
            <artifactId>quartz-jobs</artifactId>
            <version>2.2.3</version>
        </dependency>
        <!-- slf4j log4j -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.7</version>
        </dependency>
<dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

执行:

package com.quartz.test;

import org.junit.Test;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.impl.StdSchedulerFactory;

public class QuartzTest {
    @Test
    public void TestQuartz() throws Exception{
        
//        开启大管家(容器)
          Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();

//         启动
          scheduler.start();
          
//          关闭
          scheduler.shutdown();
    }
    
}

3.案例:简单任务

步骤:首先建立大管家,启动,分别创建任务详情(执行的内容)和触发器(调度的策略),建立job任务(执行的主体)

任务主体:

package com.quartz.domain;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

public class HelloJob implements Job {

    public void execute(JobExecutionContext arg0) throws JobExecutionException {
        
        System.out.println("hello,quartz!");

    }

}

 

package com.quartz.test;

import org.junit.Test;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;

import com.quartz.domain.HelloJob;

public class QuartzTest2 {
    @Test
    public void TestQuartz2() throws Exception{
        
        
//         获取大管家
        Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
        
//        开启大管家
        scheduler.start();
        
//        定义任务详情对象,参数:具体的job任务调度对象
        JobDetail jobDetail = JobBuilder.newJob(HelloJob.class)
//                参数1:任务对象的名字   参数2:任务的组     
            .withIdentity("job1", "group1")
            .build();
        
        
        //定义触发器  调度的方式  什么时候 什么频率执行job
                Trigger trigger = TriggerBuilder.newTrigger()
                        //规则的名字和规则要关联的组  参数1:触发器的名字 参数2:组的名字(放到job的组中)
                      .withIdentity("trigger1", "group1")
                      //程序启动后立即开始执行job任务(立即执行)
                      .startNow()
                      //使用什么样的定时对象(调度策略)
                      .withSchedule(
                              //简单的定时任务触发对象
                              SimpleScheduleBuilder.simpleSchedule()
                              //每隔多少秒执行一次
                              .withIntervalInSeconds(3)
                              //总共要执行多少次,这里是永远执行下去,没有限制(重复执行)
                              .repeatForever()
                              )            
                      .build();
        
//        触发器和任务详情交给大管家
                scheduler.scheduleJob(jobDetail, trigger);
                
//                不让junit终止jvm
                while(true){
                    
                }
    }
    
}

测试结果:每个3秒执行一次

4.复杂任务:与简单任务相比,就是策略不同

复杂任务:CronScheduleBuilder.cronSchedule("0/5 * * * * ?")   简单任务: SimpleScheduleBuilder.simpleSchedule()
package com.quartz.test;

import org.junit.Test;
import org.quartz.CronScheduleBuilder;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;
import org.quartz.impl.calendar.CronCalendar;

import com.quartz.domain.HelloJob;

/**
 * 复杂任务
 * @author Administrator
 *
 */
public class QuartzTest2 {
    @Test
    public void TestQuartz2() throws Exception{
        
        
//         获取大管家
        Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
        
//        开启大管家
        scheduler.start();
        
//        定义任务详情对象,参数:具体的job任务调度对象
        JobDetail jobDetail = JobBuilder.newJob(HelloJob.class)
//                参数1:任务对象的名字   参数2:任务的组     
            .withIdentity("job1", "group1")
            .build();
        
        
        //定义触发器  调度的方式  什么时候 什么频率执行job
                Trigger trigger = TriggerBuilder.newTrigger()
//                        规则的名字和规则要关联的组  参数1:触发器的名字 参数2:组的名字(放到job的组中)
                      .withIdentity("trigger1", "group1")
//                      程序启动后立即开始执行job任务(立即执行)
                      .startNow()
//                      使用什么样的定时对象(调度策略)
                      .withSchedule(
                              //复杂的定时任务触发对象(给定时间来执行任务) 参数:为属性表达式指定时间执行内容
//                              每周日的12点11分中的每隔5秒运行一次
//                              CronScheduleBuilder.cronSchedule("0/5 11 12 ? * 1")
//                              每5秒执行
                              CronScheduleBuilder.cronSchedule("0/5 * * * * ?")
                              )            
                      .build();
        
//        触发器和任务详情交给大管家
                scheduler.scheduleJob(jobDetail, trigger);
                
//                不让junit终止jvm
                while(true){
                    
                }
    }
}

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:2.4线程组创建

下一篇:Junit 测试 @Test 红名问题