Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它能够与J2EE与J2SE应用程序相结合也能够单独使用。在java企业级应用中,Quartz是使用最普遍的定时调度框架。java
在Quartz中的主要概念:mysql
在SpringBoot中,咱们须要引入quartz的依赖。git
<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便可,该方法即定时执行任务逻辑,这里简单打印了下当前时间。github
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。web
@Configuration public class QuartzConfig { @Bean public JobDetail jobDetail1(){ return JobBuilder.newJob(QuartzJob1.class).storeDurably().build(); } }
最后咱们须要定义定时调度Trigger,简单实现类SimpleScheduleBuilder用于构建Scheduler,TriggerBuilder则用于构建Trigger,spring
@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定时任务就配置完成了。sql
其实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(); }
启动程序,咱们就能够看到控制台的时间输出了。springboot
同时Quartz是支持数据持久化的,能够将定时调度信息持久化到数据库。mybatis
选择持久化到数据库,咱们须要建立对应的表,建表语句能够在Quartz官网进行下载,解压后在docs\dbTables目录下寻找对应数据库的SQL脚本。
为了方便,我也将该文件放在了项目源码resources里。
操做数据库,咱们引入相关的依赖。如有ORM框架,例如mybatis,hibernate或者jpa,则无需再引入jdbc依赖。
<!--mysql链接--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <!--druid链接池--> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1.10</version> </dependency> <!--jdbc依赖--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency>
在application.yml配置文件中,咱们对quartz持久化方式进行声明。
server: port: 10900 spring: profiles: active: dev quartz: job-store-type: jdbc #持久化到数据库 properties: org: quartz: datasource: # 新版驱动从com.mysql.jdbc.Driver变动为com.mysql.cj.jdbc.Driver driver-class-name: com.mysql.cj.jdbc.Driver # 数据源须要添加时间标准和指定编码格式解决乱码 You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if you want to utilize time zone support. url: jdbc:mysql://localhost:3306/springboot?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC username: root password: 1234 scheduler: instancName: clusteredScheduler instanceId: AUTO jobStore: class: org.quartz.impl.jdbcjobstore.JobStoreTX driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate #StdJDBCDelegate说明支持集群 tablePrefix: QRTZ_ isClustered: true clusterCheckinInterval: 1000 useProperties: false threadPool: class: org.quartz.simpl.SimpleThreadPool threadCount: 20 threadPriority: 5
这里主要就是job-store-type: jdbc,表示持久化到数据库,而后就是数据源,因为该演示项目没有其余ORM的数据源,因此这里将数据源信息定义在了quartz节点下的datasource节点,若是已经存在,可以使用同一个属性配置,固然最关键的是QuartzDataSource声明。
这里关键的是@QuartzDataSource,这个要和项目中已经存在的数据源区分开。
//Error:EmbeddedDatabaseType class not found,Druid数据源初始化须要引入spring-jdbc依赖,JPA或mybatis依赖已经包含该依赖 @Bean @QuartzDataSource @ConfigurationProperties(prefix = "spring.quartz.properties.org.quartz.datasource") DataSource quartzDataSource(){ return DruidDataSourceBuilder.create().build(); }
这样持久化就已经配置好了,咱们执行sql,再启动项目,启动完成后,咱们能够看到数据库中已经有咱们的定时调度数据了。
源码地址:https://github.com/imyanger/springboot-project/tree/master/p25-springboot-quartz