700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > Spring Boot定时任务-Quartz基本使用

Spring Boot定时任务-Quartz基本使用

时间:2021-02-21 21:03:41

相关推荐

Spring Boot定时任务-Quartz基本使用

我们在项目当中去使用一个Quartz,主要是了解Quartz的一个基本使用方式,Quartz的基本使用方式,首先打开我们的eclipse,使用SpringBoot去整合我们的Quartz,我们就不加Springboot的标记了,项目类型是jar类型,他没有父工程,我们就不用添加父工程的信息了,我们用的maven是3.2.5,他默认的JDK它是1.5的,这里也不影响使用,所以我们也不做JDK的修改了,如果在maven里做JDK的修改,我们还得去导入相应的插件,打开我们的pom文件,那么在pom文件当中呢,先来添加maven的坐标,添加Quartz的坐标<dependency><groupId>org.quartz-scheduler</groupId><artifactId>quartz</artifactId><version>2.2.1</version></dependency>Quartz运行的时候是需要依赖这个jar包的,我们看一下maven dependencies,这块我们导入了3个jar包,一个是quartz的,一个是c3p0的,还有一个是slf4j的,第二步修改pom文件,添加Quartz的坐标,然后接下来我们看一下在项目当中如何去使用Quartz,先看一下讲Quartz的时候我们说过,在这里我们需要关注三个环节,一个是我们的任务,一个是触发器,一个是任务调度,首先我们要有一个任务,但是任务我得去创建一个任务的class,所以我们先来完成一个任务class的编写,这个类的名称叫QuartzDemo,然后现在这个任务需要实现一个接口,这个接口叫什么呢,它是quartz包下的org.quartz.Job那么他在这个接口下他有一个方法,execute,这个就是任务调度需要去调度的方法,/*** 定义任务类*/public class QuartzDemo implements Job {/*** 任务被触发时所执行的方法*/public void execute(JobExecutionContext arg0) throws JobExecutionException {System.out.println("Execute...."+new Date());}}这个是Job类,定义任务类,然后这个execute方法,他所表示的含义呢,任务被触发时,所执行的方法,在这个方法里,简单的打印几句话吧,表示这个方法被执行了,然后后面还是加一个时间,这样我们一个任务类就定义好了,接下来我们来写一个测试代码,看一下怎么让我们这个任务类去执行,我叫QuartzMain,包含一个main方法,就按照我们说的三个流程去做了,我们刚才只是创建了任务类,我们只是编写这个任务类,还没有真正的去创建任务对象,在这里我们就要按照流程去做了,比如第一步我们要创建Job对象,那么这个Job是什么含义呢,我们已经说了,就是表示你要做什么事,然后第二步,创建Trigger对象,那么Trigger对象表示的是什么呢,就是在什么时间做,然后第三步,就是我们最后一步了,创建我们的Scheduler对象,那么这个就是无外乎把两个对象整合到一起了,在什么时间做什么事,这个就是我们打算用Quartz的一个基本思路,第一步怎么去创建Job对象,其实对于这个Job对象的创建呢,并不是我们想象的,通过new他就可以了,不是这样的,那我们看怎么创建呢,这里要用到一个JobDetail的一个对象,我们起个名叫Job,然后通过一个JobBuilder的一个对象,有一个静态方法,JobDetail job = JobBuilder.newJob(QuartzDemo.class).build();newJob里面需要一个class类型的参数,那我们这个参数的给定是什么呢,当前Job的class,我们要去创建QuartzDemo这个任务,然后调用newJob下的一个方法build,来构建我们的Job对象,注意我们的Job对象并不是new出来的,而是把任务类的模板给他,通过newJob的一个静态方法,并且返回一个JobDetail的对象,那么这样就完成了第一步的工作,然后接下来我们来看,怎么去创建这个Trigger对象,那么Trigger对象的创建方式呢,我们要用到TriggerBuilder的这样一个对象,Trigger trigger = TriggerBuilder.newTrigger().withSchedule(SimpleScheduleBuilder.repeatSecondlyForever()).build();通过newTrigger方法,在这个方法当中呢,他返回TriggerBuilder对象,再去调用withSchedule方法,那么在withSchedule方法当中他需要一个参数,这个参数表示的是什么意思呢,其实Trigger指的是在什么时间做,那么withSchedule里面要的其实就是你给定的一个时间,其实这个就是你Trigger触发的一个时间,那么对于Trigger触发的时间呢,我们又分为两种,一种是简单的Trigger触发时间,还有一种是基于cron表达式,我们来介绍一下这两个,第一个简单的Trigger触发时间,可以用它提供好的方法,来做一些简单的重复工作,通过Quartz提供的一个方法,来完成简单的重复调用,这是他简单Trigger的一个定义,那么QuartzTrigger表示什么意思呢,我们可以按照cron表达式给定触发的时间,这里我们先来看第一种,通过简单的Trigger该怎么去做呢,这里我们就得创建一个对象了,这个对象叫SimpleScheduleBuilderorg.quartz.SimpleScheduleBuilder在这个对象下我们来看一下,他提供了这么多方法,其实一共是12个方法,我们看一下方法的名称,比如第一个,repeatHourlyForever/*** Create a SimpleScheduleBuilder set to repeat forever with a 1 hour interval.* * @return the new SimpleScheduleBuilder*/public static SimpleScheduleBuilder repeatHourlyForever() {return simpleSchedule().withIntervalInHours(1).repeatForever();}还有一个需要参数的/*** Create a SimpleScheduleBuilder set to repeat forever with an interval* of the given number of hours.* * @return the new SimpleScheduleBuilder*/public static SimpleScheduleBuilder repeatHourlyForever(int hours) {return simpleSchedule().withIntervalInHours(hours).repeatForever();}那么这些方法表示什么意思呢,我们来看第一个repeatHourlyForever,这个方法就是,表示让他每一小时重复一次,每一小时调用一次,永远去做这个事,而第二个方法呢,需要一个int类型的hours,就是你给定一个时间,比如说我给个2,表示两小时去重复一次,并且永远去重复,你看这个参数是一个hours,所以是一个小时的一个整数,你给个2表示两小时重复一次,并且永远重复,下面还有一个/*** Create a SimpleScheduleBuilder set to repeat the given number* of times - 1 with a 1 hour interval.* * <p>Note: Total count = 1 (at start time) + repeat count</p>* * @return the new SimpleScheduleBuilder*/public static SimpleScheduleBuilder repeatHourlyForTotalCount(int count) {if(count < 1)throw new IllegalArgumentException("Total count of firings must be at least one! Given count: " + count);return simpleSchedule().withIntervalInHours(1).withRepeatCount(count - 1);}一个int类型的count,这个参数表示什么意思呢,做几次,比如这块我给一个5,表示每小时去执行一次,一共做5次,每小时做一次,其实就是等于,调用了一次,重复了4次,这里给的是执行的总数量,然后下面还有一个,/*** Create a SimpleScheduleBuilder set to repeat the given number* of times - 1 with an interval of the given number of hours.* * <p>Note: Total count = 1 (at start time) + repeat count</p>* * @return the new SimpleScheduleBuilder*/public static SimpleScheduleBuilder repeatHourlyForTotalCount(int count, int hours) {if(count < 1)throw new IllegalArgumentException("Total count of firings must be at least one! Given count: " + count);return simpleSchedule().withIntervalInHours(hours).withRepeatCount(count - 1);}需要一个count的参数和hour的参数,表示什么含义呢,第一个还是重复的次数,就是做几次的一个次数,然后后面表示一个小时,每两小时做一次,然后一共做5次,剩下的都一样,minute,seconds,就是小时分钟秒的,比如我先现在调用/*** Create a SimpleScheduleBuilder set to repeat forever with a 1 second interval.* * @return the new SimpleScheduleBuilder*/public static SimpleScheduleBuilder repeatSecondlyForever() {return simpleSchedule().withIntervalInSeconds(1).repeatForever();}就是每秒执行一次,后面并且永远执行,不停的重复,这样我们就把一个时间给定了,然后接下来我们还要去调用一个方法,build,在后面去调的,这样我们一个Trigger就定义好了,接下来我们再去看第三步,就是要创建Scheduler对象了,这个Scheduler对象怎么创建呢Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();这个对象是通过StdSchedulerFactory,通过这样的一个工厂对象,然后调用getDefaultScheduler方法,然后返回Scheduler对象,然后这里会有一个异常,我们把它给抛出去,我们接下来要做的事就是通过scheduler对象,将我们已经创建好的Job和Trigger,融合到一起,他有一个方法是scheduleJob,这里需要两个参数,一个是jobDetail,一个trigger,就把job放到里面,这个就是Triggerscheduler.scheduleJob(job, trigger);这里我们三个环节就已经做好了,有的人说挺复杂写起来,其实在这三个环节当中,他的代码是比较固化的,就是不管你做什么样的任务调度,他的代码结构都是这样的,唯独可变的就是,第一个你的Job的class可能会有变化,第二个就是你的触发时间的方式可能会有变化,我们现在用的是简单的Trigger触发,我们待会还要讲cron的触发时间,所以就这两块会有变化,其他的都是模板型的代码,然后第四步就是启动了,启动怎么启动呢,Scheduler去调用它的start方法就可以了scheduler.start();我们来执行一下,来观察控制台,可以看到execute方法已经执行了,并且是每秒执行一次,这个就是Quartz的基本使用流程,然后这里我们使用的是一个简单的Trigger,我们用cron表达式来做,看看这块要怎么去实现,Trigger trigger = TriggerBuilder.newTrigger().withSchedule(CronScheduleBuilder.cronSchedule("0/2 * * * * ?")).build();其实就是把SimpleScheduleBuilder.repeatSecondlyForever()给换一下,换成什么呢,CronScheduleBuilder,在这个对象下有一个cronSchedule,叫这样的一个方法,需要一个字符串的参数,其实字符串参数就是我们讲的cron表达式,比如这里我们还是安排两秒去触发一次,怎么给呢,"0/2 * * * * ?",我们还是用6个域的表现形式,我们只要把这个换了就行,其他的都不要动,接下来我们再去运行,以两秒的节奏去触发我们的方法,那以上就是使用cron的表达式,来给定一个触发的一个时间,这个就是Quartz的一个基本使用流程

<project xmlns="/POM/4.0.0" xmlns:xsi="/2001/XMLSchema-instance" xsi:schemaLocation="/POM/4.0.0 /xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.learn</groupId><artifactId>quartz-demo</artifactId><version>0.0.1-SNAPSHOT</version><!-- <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>1.5.12.RELEASE</version></parent> --><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><java.version>1.8</java.version></properties><dependencies><!-- springBoot的启动器 --><!-- <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency> --><!-- 添加Scheduled坐标 --><!-- <dependency><groupId>org.springframework</groupId><artifactId>spring-context-support</artifactId></dependency> --><!-- Quartz坐标 --><dependency><groupId>org.quartz-scheduler</groupId><artifactId>quartz</artifactId><version>2.2.1</version></dependency></dependencies></project>

package com.learn.quartz;import java.util.Date;import org.quartz.Job;import org.quartz.JobExecutionContext;import org.quartz.JobExecutionException;/*** 定义任务类*/public class QuartzDemo implements Job {/*** 任务被触发时所执行的方法*/public void execute(JobExecutionContext arg0) throws JobExecutionException {System.out.println("Execute...."+new Date());}}

package com.learn.quartz;import org.quartz.CronScheduleBuilder;import org.quartz.JobBuilder;import org.quartz.JobDetail;import org.quartz.Scheduler;import org.quartz.Trigger;import org.quartz.TriggerBuilder;import org.quartz.impl.StdSchedulerFactory;public class QuartzMain {public static void main(String[] args) throws Exception {// 1.创建Job对象:你要做什么事?JobDetail job = JobBuilder.newJob(QuartzDemo.class).build();/*** 简单的trigger触发时间:通过Quartz提供一个方法来完成简单的重复调用 cron* Trigger:按照Cron的表达式来给定触发的时间*/// 2.创建Trigger对象:在什么时间做?//Trigger trigger = TriggerBuilder.newTrigger().withSchedule(SimpleScheduleBuilder.repeatSecondlyForever())//.build();Trigger trigger = TriggerBuilder.newTrigger().withSchedule(CronScheduleBuilder.cronSchedule("0/2 * * * * ?")).build();// 3.创建Scheduler对象:在什么时间做什么事?Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();scheduler.scheduleJob(job, trigger);//启动scheduler.start();}}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。