百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

Java大型互联网-奇妙无比的Quartz构建一个Spring Boot项目精要

ccwgpt 2024-09-18 12:27 32 浏览 0 评论

引言

Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。通过这种方式,Spring Boot致力于在蓬勃发展的快速应用开发领域(rapid application development)成为领导者。

基于Quartz构建一个Spring Boot项目开发

构建项目

我们使用idea开发工具创建一个SpringBoot项目,pom.xml依赖配置如下所示:

...省略部分配置

<properties>

<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>

<java.version>1.8</java.version>

<druid.version>1.1.5</druid.version>

<quartz.version>2.3.0</quartz.version>

</properties>

<dependencies>

<!--spring data jpa相关-->

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-data-jpa</artifactId>

</dependency>

<!--web相关依赖-->

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-web</artifactId>

</dependency>

<!--数据库相关依赖-->

<dependency>

<groupId>mysql</groupId>

<artifactId>mysql-connector-java</artifactId>

<scope>runtime</scope>

</dependency>

<dependency>

<groupId>com.alibaba</groupId>

<artifactId>druid</artifactId>

<version>${druid.version}</version>

</dependency>

<!--quartz相关依赖-->

<dependency>

<groupId>org.quartz-scheduler</groupId>

<artifactId>quartz</artifactId>

<version>${quartz.version}</version>

</dependency>

<dependency>

<groupId>org.quartz-scheduler</groupId>

<artifactId>quartz-jobs</artifactId>

<version>${quartz.version}</version>

</dependency>

<!--定时任务需要依赖context模块-->

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-context-support</artifactId>

</dependency>

<dependency>

<groupId>org.projectlombok</groupId>

<artifactId>lombok</artifactId>

</dependency>

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-test</artifactId>

<scope>test</scope>

</dependency>

</dependencies>

...省略部分配置

我们采用的是quartz官方最新版本2.3.0,新版本的任务调度框架做出了很多封装,使用也变得简易明了。

创建初始化完成,下面我们来创建定时任务相关的Configuration配置。

QuartzConfiguration

quartz与Spring相关框架的整合方式有很多种,我们今天采用jobDetail使用Spring Ioc托管方式来完成整合,我们可以在定时任务实例中使用Spring注入注解完成业务逻辑处理,下面我先把全部的配置贴出来再逐步分析,配置类如下所示:

package com.hengyu.chapter39.configuration;

import org.quartz.spi.JobFactory;

import org.quartz.spi.TriggerFiredBundle;

import org.springframework.beans.factory.annotation.Autowire;

import org.springframework.beans.factory.config.AutowireCapableBeanFactory;

import org.springframework.context.ApplicationContext;

import org.springframework.context.ApplicationContextAware;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

import org.springframework.core.io.ClassPathResource;

import org.springframework.scheduling.annotation.EnableScheduling;

import org.springframework.scheduling.quartz.SchedulerFactoryBean;

import org.springframework.scheduling.quartz.SpringBeanJobFactory;

import javax.sql.DataSource;

/**

* quartz定时任务配置

* ========================

* Created with IntelliJ IDEA.

* User:恒宇少年

* Date:2017/11/5

* Time:14:07

* 码云:http://git.oschina.net/jnyqy

* ========================

* @author 恒宇少年

*/

@Configuration

@EnableScheduling

public class QuartzConfiguration

{

/**

* 继承org.springframework.scheduling.quartz.SpringBeanJobFactory

* 实现任务实例化方式

*/

public static class AutowiringSpringBeanJobFactory extends SpringBeanJobFactory implements

ApplicationContextAware {

private transient AutowireCapableBeanFactory beanFactory;

@Override

public void setApplicationContext(final ApplicationContext context) {

beanFactory = context.getAutowireCapableBeanFactory();

}

/**

* 将job实例交给spring ioc托管

* 我们在job实例实现类内可以直接使用spring注入的调用被spring ioc管理的实例

* @param bundle

* @return

* @throws Exception

*/

@Override

protected Object createJobInstance(final TriggerFiredBundle bundle) throws Exception {

final Object job = super.createJobInstance(bundle);

/**

* 将job实例交付给spring ioc

*/

beanFactory.autowireBean(job);

return job;

}

}

/**

* 配置任务工厂实例

* @param applicationContext spring上下文实例

* @return

*/

@Bean

public JobFactory jobFactory(ApplicationContext applicationContext)

{

/**

* 采用自定义任务工厂 整合spring实例来完成构建任务

* see {@link AutowiringSpringBeanJobFactory}

*/

AutowiringSpringBeanJobFactory jobFactory = new AutowiringSpringBeanJobFactory();

jobFactory.setApplicationContext(applicationContext);

return jobFactory;

}

/**

* 配置任务调度器

* 使用项目数据源作为quartz数据源

* @param jobFactory 自定义配置任务工厂

* @param dataSource 数据源实例

* @return

* @throws Exception

*/

@Bean(destroyMethod = "destroy",autowire = Autowire.NO)

public SchedulerFactoryBean schedulerFactoryBean(JobFactory jobFactory, DataSource dataSource) throws Exception

{

SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean();

//将spring管理job自定义工厂交由调度器维护

schedulerFactoryBean.setJobFactory(jobFactory);

//设置覆盖已存在的任务

schedulerFactoryBean.setOverwriteExistingJobs(true);

//项目启动完成后,等待2秒后开始执行调度器初始化

schedulerFactoryBean.setStartupDelay(2);

//设置调度器自动运行

schedulerFactoryBean.setAutoStartup(true);

//设置数据源,使用与项目统一数据源

schedulerFactoryBean.setDataSource(dataSource);

//设置上下文spring bean name

schedulerFactoryBean.setApplicationContextSchedulerContextKey("applicationContext");

//设置配置文件位置

schedulerFactoryBean.setConfigLocation(new ClassPathResource("/quartz.properties"));

return schedulerFactoryBean;

}

}

AutowiringSpringBeanJobFactory

可以看到上面配置类中,AutowiringSpringBeanJobFactory我们继承了SpringBeanJobFactory类,并且通过实现ApplicationContextAware接口获取ApplicationContext设置方法,通过外部实例化时设置ApplicationContext实例对象,在createJobInstance方法内,我们采用AutowireCapableBeanFactory来托管SpringBeanJobFactory类中createJobInstance方法返回的定时任务实例,这样我们就可以在定时任务类内使用Spring Ioc相关的注解进行注入业务逻辑实例了。

JobFactory

任务工厂是在本章配置调度器时所需要的实例,我们通过jobFactory方法注入ApplicationContext实例,来创建一个AutowiringSpringBeanJobFactory对象,并且将对象实例托管到Spring Ioc容器内。

SchedulerFactoryBean

我们本章采用的是项目内部数据源的方式来设置调度器的jobSotre,官方quartz有两种持久化的配置方案。

第一种:采用quartz.properties配置文件配置独立的定时任务数据源,可以与使用项目的数据库完全独立。

第二种:采用与创建项目统一个数据源,定时任务持久化相关的表与业务逻辑在同一个数据库内。

可以根据实际的项目需求采取不同的方案,我们本章主要是通过第二种方案来进行讲解,在上面配置类中可以看到方法schedulerFactoryBean内自动注入了JobFactory实例,也就是我们自定义的AutowiringSpringBeanJobFactory任务工厂实例,另外一个参数就是DataSource,在我们引入spring-starter-data-jpa依赖后会根据application.yml文件内的数据源相关配置自动实例化DataSource实例,这里直接注入是没有问题的。

我们通过调用SchedulerFactoryBean对象的setConfigLocation方法来设置quartz定时任务框架的基本配置,配置文件所在位置:resources/quartz.properties => classpath:/quartz.properties下。

注意:quartz.properties配置文件一定要放在classpath下,放在别的位置有部分功能不会生效。

下面我们来看下quartz.properties文件内的配置,如下所示:

#调度器实例名称

org.quartz.scheduler.instanceName = quartzScheduler

#调度器实例编号自动生成

org.quartz.scheduler.instanceId = AUTO

#持久化方式配置

org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX

#持久化方式配置数据驱动,MySQL数据库

org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate

#quartz相关数据表前缀名

org.quartz.jobStore.tablePrefix = QRTZ_

#开启分布式部署

org.quartz.jobStore.isClustered = true

#配置是否使用

org.quartz.jobStore.useProperties = false

#分布式节点有效性检查时间间隔,单位:毫秒

org.quartz.jobStore.clusterCheckinInterval = 20000

#线程池实现类

org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool

#执行最大并发线程数量

org.quartz.threadPool.threadCount = 10

#线程优先级

org.quartz.threadPool.threadPriority = 5

#配置为守护线程,设置后任务将不会执行

#org.quartz.threadPool.makeThreadsDaemons=true

#配置是否启动自动加载数据库内的定时任务,默认true

org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread = true

由于我们下一章需要做分布式多节点自动交付高可用,本章的配置文件加入了分布式相关的配置。

在上面配置中org.quartz.jobStore.class与org.quartz.jobStore.driverDelegateClass是定时任务持久化的关键配置,配置了数据库持久化定时任务以及采用MySQL数据库进行连接,当然这里我们也可以配置其他的数据库,如下所示:

PostgreSQL : org.quartz.impl.jdbcjobstore.PostgreSQLDelegate

Sybase : org.quartz.impl.jdbcjobstore.SybaseDelegate

MSSQL : org.quartz.impl.jdbcjobstore.MSSQLDelegate

HSQLDB : org.quartz.impl.jdbcjobstore.HSQLDBDelegate

Oracle : org.quartz.impl.jdbcjobstore.oracle.OracleDelegate

org.quartz.jobStore.tablePrefix属性配置了定时任务数据表的前缀,在quartz官方提供的创建表SQL脚本默认就是qrtz_,在对应的XxxDelegate驱动类内也是使用的默认值,所以这里我们如果修改表名前缀,配置可以去掉。

org.quartz.jobStore.isClustered属性配置了开启定时任务分布式功能,再开启分布式时对应属性org.quartz.scheduler.instanceId 改成Auto配置即可,实例唯一标识会自动生成,这个标识具体生成的内容,我们一会在运行的控制台就可以看到了,定时任务分布式准备好后会输出相关的分布式节点配置信息。

总结

以 上就是我对Java大型互联网-奇妙无比的Quartz构建一个Spring Boot项目精要问题及其优化总结,分享给大家,希望大家知道什么是Java大型互联网-奇妙无比的Quartz构建一个Spring Boot项目精要问题及其优化。觉得收获的话可以点个关注收藏转发一波喔,谢谢大佬们支持!

  • 1、多写多敲代码,好的代码与扎实的基础知识一定是实践出来的

  • 2、可以去百度搜索腾讯课堂图灵学院的视频来学习一下java架构实战案例,还挺不错的。

  • 最后,每一位读到这里的网友,感谢你们能耐心地看完。希望在成为一名更优秀的Java程序员的道路上,我们可以一起学习、一起进步!都能赢取白富美,走向架构师的人生巅峰!

  • 3丶想了解学习以上课程内容可加群:469717771 验证码头条(06 必过)欢迎大家的加入哟!

相关推荐

团队管理“布阵术”:3招让你的团队战斗力爆表!

为何古代军队能够以一当十?为何现代企业有的团队高效似“特种部队”,有的却松散若“游击队”?**答案正隐匿于“布阵术”之中!**今时今日,让我们从古代兵法里萃取3个核心要义,助您塑造一支战斗力爆棚的...

知情人士回应字节大模型团队架构调整

【知情人士回应字节大模型团队架构调整】财联社2月21日电,针对原谷歌DeepMind副总裁吴永辉加入字节跳动后引发的团队调整问题,知情人士回应称:吴永辉博士主要负责AI基础研究探索工作,偏基础研究;A...

豆包大模型团队开源RLHF框架,训练吞吐量最高提升20倍

强化学习(RL)对大模型复杂推理能力提升有关键作用,但其复杂的计算流程对训练和部署也带来了巨大挑战。近日,字节跳动豆包大模型团队与香港大学联合提出HybridFlow。这是一个灵活高效的RL/RL...

创业团队如何设计股权架构及分配(创业团队如何设计股权架构及分配方案)

创业团队的股权架构设计,决定了公司在随后发展中呈现出的股权布局。如果最初的股权架构就存在先天不足,公司就很难顺利、稳定地成长起来。因此,创业之初,对股权设计应慎之又慎,避免留下巨大隐患和风险。两个人如...

消息称吴永辉入职后引发字节大模型团队架构大调整

2月21日,有消息称前谷歌大佬吴永辉加入字节跳动,并担任大模型团队Seed基础研究负责人后,引发了字节跳动大模型团队架构大调整。多名原本向朱文佳汇报的算法和技术负责人开始转向吴永辉汇报。简单来说,就是...

31页组织效能提升模型,经营管理团队搭建框架与权责定位

分享职场干货,提升能力!为职场精英打造个人知识体系,升职加薪!31页组织效能提升模型如何拿到分享的源文件:请您关注本头条号,然后私信本头条号“文米”2个字,按照操作流程,专人负责发送源文件给您。...

异形柱结构(异形柱结构技术规程)

下列关于混凝土异形柱结构设计的说法,其中何项正确?(A)混凝土异形柱框架结构可用于所有非抗震和抗震设防地区的一般居住建筑。(B)抗震设防烈度为6度时,对标准设防类(丙类)采用异形柱结构的建筑可不进行地...

职场干货:金字塔原理(金字塔原理实战篇)

金字塔原理的适用范围:金字塔原理适用于所有需要构建清晰逻辑框架的文章。第一篇:表达的逻辑。如何利用金字塔原理构建基本的金字塔结构受众(包括读者、听众、观众或学员)最容易理解的顺序:先了解主要的、抽象的...

底部剪力法(底部剪力法的基本原理)

某四层钢筋混凝土框架结构,计算简图如图1所示。抗震设防类别为丙类,抗震设防烈度为8度(0.2g),Ⅱ类场地,设计地震分组为第一组,第一自振周期T1=0.55s。一至四层的楼层侧向刚度依次为:K1=1...

结构等效重力荷载代表值(等效重力荷载系数)

某五层钢筋混凝土框架结构办公楼,房屋高度25.45m。抗震设防烈度8度,设防类别丙类,设计基本地震加速度0.2g,设计地震分组第二组,场地类别为Ⅱ类,混凝土强度等级C30。该结构平面和竖向均规则。假定...

体系结构已成昭告后世善莫大焉(体系构架是什么意思)

实践先行也理论已初步完成框架结构留余后人后世子孙俗话说前人栽树后人乘凉在夏商周大明大清民国共和前人栽树下吾之辈已完成结构体系又俗话说青出于蓝而胜于蓝各个时期任务不同吾辈探索框架结构体系经历有限肯定发展...

框架柱抗震构造要求(框架柱抗震设计)

某现浇钢筋混凝土框架-剪力墙结构高层办公楼,抗震设防烈度为8度(0.2g),场地类别为Ⅱ类,抗震等级:框架二级,剪力墙一级,混凝土强度等级:框架柱及剪力墙C50,框架梁及楼板C35,纵向钢筋及箍筋均采...

梁的刚度、挠度控制(钢梁挠度过大会引起什么原因)

某办公楼为现浇钢筋混凝土框架结构,r0=1.0,混凝土强度等级C35,纵向钢筋采用HRB400,箍筋采用HPB300。其二层(中间楼层)的局部平面图和次梁L-1的计算简图如图1~3(Z)所示,其中,K...

死要面子!有钱做大玻璃窗,却没有钱做“柱和梁”,不怕房塌吗?

活久见,有钱做2层落地大玻璃窗,却没有钱做“柱子和圈梁”,这样的农村自建房,安全吗?最近刷到个魔幻施工现场,如下图,这栋5开间的农村自建房,居然做了2个全景落地窗仔细观察,这2个落地窗还是飘窗,为了追...

不是承重墙,物业也不让拆?话说装修就一定要拆墙才行么

最近发现好多朋友装修时总想拆墙“爆改”空间,别以为只要避开承重墙就能随便砸!我家楼上邻居去年装修,拆了阳台矮墙想扩客厅,结果物业直接上门叫停。后来才知道,这种配重墙拆了会让阳台承重失衡,整栋楼都可能变...

取消回复欢迎 发表评论: