700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > SpringBoot系列:Spring Boot集成定时任务Quartz

SpringBoot系列:Spring Boot集成定时任务Quartz

时间:2021-05-01 19:29:21

相关推荐

SpringBoot系列:Spring Boot集成定时任务Quartz

一、关于Quartz

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

在Quartz中的主要概念:

Scheduler:调度任务的主要APIScheduleBuilder:用于构建Scheduler,例如其简单实现类SimpleScheduleBuilderJob:调度任务执行的接口,也即定时任务执行的方法JobDetail:定时任务作业的实例JobBuilder:关联具体的Job,用于构建JobDetailTrigger:定义调度执行计划的组件,即定时执行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 {@Overrideprotected 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。

@Configurationpublic class QuartzConfig {@Beanpublic JobDetail jobDetail1(){return JobBuilder.newJob(QuartzJob1.class).storeDurably().build();}}

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

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

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

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

@Beanpublic JobDetail jobDetail2(){QuartzJobBean quartzJob2 = new QuartzJobBean() {@Overrideprotected 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();}@Beanpublic 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是支持数据持久化的,可以将定时调度信息持久化到数据库。

选择持久化到数据库,我们需要创建对应的表,建表语句可以在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: 10900spring:profiles:active: devquartz:job-store-type: jdbc #持久化到数据库properties:org:quartz:datasource:# 新版驱动从com.mysql.jdbc.Driver变更为com.mysql.cj.jdbc.Driverdriver-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=UTCusername: rootpassword: 1234scheduler:instancName: clusteredSchedulerinstanceId: AUTOjobStore:class: org.quartz.impl.jdbcjobstore.JobStoreTXdriverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate #StdJDBCDelegate说明支持集群tablePrefix: QRTZ_isClustered: trueclusterCheckinInterval: 1000useProperties: falsethreadPool:class: org.quartz.simpl.SimpleThreadPoolthreadCount: 20threadPriority: 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.datasource")DataSource quartzDataSource(){return DruidDataSourceBuilder.create().build();}

这样持久化就已经配置好了,我们执行sql,再启动项目,启动完成后,我们可以看到数据库中已经有我们的定时调度数据了。

源码地址:/imyanger/springboot-project/tree/master/p25-springboot-quartz

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