java quartz 源码_Springboot2+Quartz+debug源码教程

3064da1b485205af5e0244ca842a6ee0.png

内容概览:

Springboot2+quartz 的简单使用 和 深入源码了解初始化表结构的三个选项Always,Never,Embedded

一. pom 文件 引入 quartz jar包

org.springframework.boot

spring-boot-starter-quartz

二. 创建一个job并继承QuartzJobBean

package com.java4ye.demo.job;

import lombok.extern.slf4j.Slf4j;

import org.quartz.JobDataMap;

import org.quartz.JobExecutionContext;

import org.quartz.JobExecutionException;

import org.quartz.JobKey;

import org.springframework.scheduling.quartz.QuartzJobBean;

/**

* @author Java4ye

* @date 2021/1/9 10:50

* @微信公众号:Java4ye

* @GitHub https://github.com/RyzeYang

* @博客 https://blog.csdn.net/weixin_40251892

*/

@Slf4j

public class HelloWorldJob extends QuartzJobBean {

@Override

protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {

JobKey key = jobExecutionContext.getJobDetail().getKey();

log.info("[JobKey] name:{},group:{}",key.getName(),key.getGroup());

JobDataMap jobDataMap = jobExecutionContext.getJobDetail().getJobDataMap();

log.info("[jobDataMap] arg1:{},arg2:{}",jobDataMap.get("arg1"),jobDataMap.get("arg2"));

}

}

三. 创建JobDetail和Trigger

package com.java4ye.demo.config;

import com.java4ye.demo.job.HelloWorldJob;

import org.quartz.*;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

/**

* @author Java4ye

* @date 2021/1/9 10:48

* @微信公众号:Java4ye

* @GitHub https://github.com/RyzeYang

* @博客 https://blog.csdn.net/weixin_40251892

*/

@Configuration

public class QuartzConfig {

@Bean

public JobDetail myJobDetail() {

return JobBuilder.newJob(HelloWorldJob.class)

.withIdentity("HelloWorldJob", "HelloWorldJob")

//JobDataMap可以给任务execute传递参数

.usingJobData("arg1", "Hello")

.usingJobData("arg2", "World")

.storeDurably()

.build();

}

@Bean

public Trigger myTrigger() {

return TriggerBuilder.newTrigger()

.forJob(myJobDetail())

.withIdentity("Hello World Job TRIGGER", "TRIGGER GROUP1")

.usingJobData("arg11","TRIGGER-arg11")

.usingJobData("arg1","TRIGGER-arg1")

.startNow()

//.withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(5).repeatForever())

.withSchedule(CronScheduleBuilder.cronSchedule("0/10 * * * * ?"))

.build();

}

}

四. 配置 application.yml

spring:

datasource:

url:jdbc:mysql://192.168.80.128:3306/yang?useSSL=false&useUnicode=true&characterEncoding=utf-8

username:java4ye

password:123456

driver-class-name:com.mysql.cj.jdbc.Driver

quartz:

jdbc:

#     这里有 三个选项 always(每次都帮你创建表) never(自己手动建表) embedded 默认的

initialize-schema:always

#持久化到数据库方式

job-store-type:jdbc

properties:

org:

quartz:

scheduler:

instanceName:MysqlScheduler

instanceId:AUTO

startupDelay:10

jobStore:

class:org.quartz.impl.jdbcjobstore.JobStoreTX

driverDelegateClass:org.quartz.impl.jdbcjobstore.StdJDBCDelegate

tablePrefix:QRTZ_

isClustered:true

clusterCheckinInterval:10000

useProperties:false

threadPool:

class:org.quartz.simpl.SimpleThreadPool

#线程数 一个任务使用一个线程

threadCount:10

threadPriority:5

threadsInheritContextClassLoaderOfInitializingThread:true

这里博主有个疑问.. 这个初始化表结构的embedded(内嵌的) 要怎么理解,它是默认的选项.

于是乎..开始折腾了😝

五. debug 源码

看看初始化表结构时embedded等操作.

1.  将项目跑起来

2.  步骤

按照图中四个步骤操作

点击 Endpoints

输入quartz 搜索

点击 quartzScheduler

按住ctrl 键 + 鼠标滚轮放大图片 (按住 alt 键 有放大镜功能),   然后点击quartzDataSourceInitializer,双击或者按F4可以跳转到源码处  (看这个名字应该是初始化的,先进来看看有没有找错)

9417e3ccd3ea3b1d91ac2a0b8852a422.png

3. 打下断点:  QuartzDataSourceInitializer ,并用debug方式启动

80e5ea5b7109713c9a05004e765204d0.png

按下 F7 进去, 再进去super(dataSource, resourceLoader);方法可以看到下图

b1bc88ca0473bc8dfb26fc696f71d6e3.png

注意这里有个@PostConstruct

@PostConstruct注解的方法将会在依赖注入完成后被自动调用。

Constructor >> @Autowired >> @PostConstruct

所以我们直接在这里打个断点

4. 打下断点如上图: @PostConstruct 并直接按f9 就可以到该方法了

直接进入到isEnabled方法 , 可以看到下图 : 由于我们配置的是Always

quartz:

jdbc:

#     这里有 三个选项 always(每次都帮你创建表) never(自己手动建表) embedded 默认的

initialize-schema: always

所以 在进行逻辑或运算时直接返回 true .不会执行后面的EmbeddedDatabaseConnection.isEmbedded(this.dataSource);代码

6b3d171e593e3769e00bece23b238f42.png

5. 执行 sql 语句代码 (重点)

从上图 debug 下来 可以看到 会去加载  这个 路径下的sql文件 ,最后

76c23e9332aa7952e0f92aa59494b21b.png

来到 jar 包中可以看到还有很多其他的sql文件

820dccb2333065aa19dcaa27d526e22a.png

6. 将 配置 修改为 Emembedded 默认的

然后自己一步步 去 debug 下EmbeddedDatabaseConnection.isEmbedded(this.dataSource);这段代码就知道啦~ 博主这里说下结果了!😝

可以发现当你使用的数据库是内存型的如 H2 等时, 它 也会返回 true 即 isEnabled() 为 True, 然后会去执行创建 表格的sql语句,如上图中的sql文件

具体可以看看下图:

081b751d8d10640fbd9029d4964d0766.png

结论

初始化表结构时,使用  embedded(内嵌的) 会去 看看db的类型是不是内嵌型的数据库或者说是内存型的  如常见的: h2

扩展

有兴趣的小伙伴还可以在debug过程中留意下 Spring boot 初始化 Bean 的一些操作

775f8a593a5f31848e0cfb1799406723.png

6cea2973fa275393b31d0b656e37a254.gif

谢谢可爱又帅气的大佬们的观看!祝您 天天开心!😄

感谢您的关注!您的每个关注,都是博主生发的动力 😝

点个“在看”表示朕

已阅

往期精彩回顾

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值