内容概览:
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可以跳转到源码处 (看这个名字应该是初始化的,先进来看看有没有找错)
3. 打下断点: QuartzDataSourceInitializer ,并用debug方式启动
按下 F7 进去, 再进去super(dataSource, resourceLoader);方法可以看到下图
注意这里有个@PostConstruct
@PostConstruct注解的方法将会在依赖注入完成后被自动调用。
Constructor >> @Autowired >> @PostConstruct
所以我们直接在这里打个断点
4. 打下断点如上图: @PostConstruct 并直接按f9 就可以到该方法了
直接进入到isEnabled方法 , 可以看到下图 : 由于我们配置的是Always
quartz:
jdbc:
# 这里有 三个选项 always(每次都帮你创建表) never(自己手动建表) embedded 默认的
initialize-schema: always
所以 在进行逻辑或运算时直接返回 true .不会执行后面的EmbeddedDatabaseConnection.isEmbedded(this.dataSource);代码
5. 执行 sql 语句代码 (重点)
从上图 debug 下来 可以看到 会去加载 这个 路径下的sql文件 ,最后
来到 jar 包中可以看到还有很多其他的sql文件
6. 将 配置 修改为 Emembedded 默认的
然后自己一步步 去 debug 下EmbeddedDatabaseConnection.isEmbedded(this.dataSource);这段代码就知道啦~ 博主这里说下结果了!😝
可以发现当你使用的数据库是内存型的如 H2 等时, 它 也会返回 true 即 isEnabled() 为 True, 然后会去执行创建 表格的sql语句,如上图中的sql文件
具体可以看看下图:
结论
初始化表结构时,使用 embedded(内嵌的) 会去 看看db的类型是不是内嵌型的数据库或者说是内存型的 如常见的: h2
扩展
有兴趣的小伙伴还可以在debug过程中留意下 Spring boot 初始化 Bean 的一些操作
谢谢可爱又帅气的大佬们的观看!祝您 天天开心!😄
感谢您的关注!您的每个关注,都是博主生发的动力 😝
点个“在看”表示朕
已阅
往期精彩回顾