一、关于Quartz

Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用。在java企业级应用中,Quartz是使用最广泛的定时调度框架。

在Quartz中的主要概念:

  • Scheduler:调度任务的主要API
  • ScheduleBuilder:用于构建Scheduler,例如其简单实现类SimpleScheduleBuilder
  • Job:调度任务执行的接口,也即定时任务执行的方法
  • JobDetail:定时任务作业的实例
  • JobBuilder:关联具体的Job,用于构建JobDetail
  • Trigger:定义调度执行计划的组件,即定时执行
  • TriggerBuilder:构建Trigger

一、Quartz演示示例

在SpringBoot中,我们需要引入quartz的依赖。

 <dependency>     <groupId>org.springframework.boot</groupId>     <artifactId>spring-boot-starter-web</artifactId> </dependency>  <!--quartz定时调度依赖--> <dependency>     <groupId>org.springframework.boot</groupId>     <artifactId>spring-boot-starter-quartz</artifactId> </dependency>

首先定义定时具体执行逻辑Job,创建类QuartzJob1,这里集继承QuartzJobBean实现executeInternal即可,该方法即定时执行任务逻辑,这里简单打印了下当前时间。

public class QuartzJob1 extends QuartzJobBean {      @Override     protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {         SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");         System.out.println("QuartzJob1----" + sdf.format(new Date()));     }  }

然后创建QuartzConfig,接着定义JobDetail,JobDetail由JobBuilder构建,同时关联了任务QuartzJob1。

@Configuration public class QuartzConfig {      @Bean     public JobDetail jobDetail1(){         return JobBuilder.newJob(QuartzJob1.class).storeDurably().build();     }      }

最后我们需要定义定时调度Trigger,简单实现类SimpleScheduleBuilder用于构建Scheduler,TriggerBuilder则用于构建Trigger,

@Configuration public class QuartzConfig {      @Bean     public JobDetail jobDetail1(){         return JobBuilder.newJob(QuartzJob1.class).storeDurably().build();     }      @Bean     public Trigger trigger1(){         SimpleScheduleBuilder scheduleBuilder = SimpleScheduleBuilder.simpleSchedule()                 .withIntervalInSeconds(1) //每一秒执行一次                 .repeatForever(); //永久重复,一直执行下去         return TriggerBuilder.newTrigger()                 .forJob(jobDetail1())                 .withSchedule(scheduleBuilder)                 .build();     }      }

这样一个Quartz定时任务就配置完成了。

其实Job的定义也可以使用内部类,这样可以省去Job类的创建,例如下面定时任务2 jobDetail2和trigger2。

@Bean public JobDetail jobDetail2(){     QuartzJobBean quartzJob2 = new QuartzJobBean() {         @Override         protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {             SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");             System.out.println("内部类quartzJob2----" + sdf.format(new Date()));         }     };     return JobBuilder.newJob(quartzJob2.getClass()).storeDurably().build(); }  @Bean public Trigger trigger2(){     //JobDetail的bean注入不能省略     //JobDetail jobDetail3 = JobBuilder.newJob(QuartzJob2.class).storeDurably().build();     SimpleScheduleBuilder scheduleBuilder = SimpleScheduleBuilder.simpleSchedule()             .withIntervalInSeconds(2) //每2秒执行一次             .repeatForever(); //永久重复,一直执行下去     return TriggerBuilder.newTrigger()             .forJob(jobDetail2())             .withSchedule(scheduleBuilder).build(); }

启动程序,我们就可以看到控制台的时间输出了。

同时Quartz是支持数据持久化的,可以将定时调度信息持久化到数据库。

选择持久化到数据库