Quartz
是一个定时工作的调度框架,波及到的次要概念有以下几个:
Scheduler
:调度器,所有的调度都由它管制,所有的工作都由它治理。
Job
:工作,定义业务逻辑。
JobDetail
:基于Job,进一步封装。其中关联一个Job,并为Job指定更具体的信息。
Trigger
:触发器,能够指定给某个工作,指定工作的触发机制。
一 创立简略工作
1.1 Quartz依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
1.2 创立工作
工作创立须要实现Job
接口,重写execute(JobExecutionContext jobExecutionContext)
办法,减少定时工作的业务逻辑,这里我只是简略的打印一下定时工作执行。
@Slf4j
public class SimpleJob implements Job {
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
log.info("job execute---"+new Date());
}
}
1.3 JobDetail减少属性
这里减少的属性能够在Job实现类中获取,来解决业务。
JobDetail jobDetail = JobBuilder.newJob(SimpleJob.class)
// 工作标识,及工作分组
.withIdentity("job1", "group1")
// 链接调用,减少须要的参数
.usingJobData("name","Java旅途")
.usingJobData("age",18)
.build();
1.4 Trigger实现
Trigger分为两种,SimpleTrigger
和CronTrigger
。SimpleTrigger
是依据Quartz的一些api实现的简略触发行为。CronTrigger
用的比拟多,应用cron
表达式进行触发。这里先用SimpleTrigger
来实现。
SimpleTrigger simpleTrigger = TriggerBuilder.newTrigger()
.withIdentity("trigger1", "group1")
// 立刻执行
.startNow()
// 10s后进行
.endAt(new Date(System.currentTimeMillis()+10*1000))
.withSchedule(
SimpleScheduleBuilder.simpleSchedule()
// 每秒执行一次
.withIntervalInSeconds(1)
// 始终执行
.repeatForever()
).build();
1.5 启动工作
@Autowired
private Scheduler scheduler;
scheduler.scheduleJob(jobDetail,simpleTrigger);
1.6 执行成果
启动我的项目后,工作立刻执行,每秒执行一次,10s后进行,执行效果图如下:
二 动静操作定时工作
有时候除了曾经开发好的定时工作外,还须要咱们手动去创立工作并且管制工作的执行。
2.1 创立工作
@GetMapping("create")
public void createJob(String jobName,String jobGroup,String cron,String triggerName,String triggerGroup) throws SchedulerException {
JobKey jobKey = new JobKey(jobName,jobGroup);
// 如果存在这个工作,则删除
if(scheduler.checkExists(jobKey)) {
scheduler.deleteJob(jobKey);
}
JobDetail jobDetail = JobBuilder.newJob(SimpleJob.class)
.withIdentity(jobKey)
.build();
CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(cron);
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity(triggerName,triggerGroup)
.withSchedule(cronScheduleBuilder).build();
scheduler.scheduleJob(jobDetail,trigger);
}
2.2 暂停工作
@GetMapping("pause")
public void pauseJob(String jobName,String jobGroup) throws SchedulerException {
JobKey jobKey = JobKey.jobKey(jobName, jobGroup);
JobDetail jobDetail = scheduler.getJobDetail(jobKey);
if (jobDetail == null) {
return;
}
scheduler.pauseJob(jobKey);
}
2.3 复原暂停的工作
@GetMapping("remuse")
public void remuseJob(String jobName, String jobGroup) throws SchedulerException {
JobKey jobKey = JobKey.jobKey(jobName, jobGroup);
JobDetail jobDetail = scheduler.getJobDetail(jobKey);
if (jobDetail == null) {
return;
}
scheduler.resumeJob(jobKey);
}
2.4 删除定时工作
@GetMapping("remove")
public void removeJob(String jobName, String jobGroup,String triggerName,String triggerGroup) throws SchedulerException {
TriggerKey triggerKey = TriggerKey.triggerKey(triggerName, triggerGroup);
JobKey jobKey = JobKey.jobKey(jobName, jobGroup);
Trigger trigger = scheduler.getTrigger(triggerKey);
if (trigger == null) {
return;
}
// 进行触发器
scheduler.pauseTrigger(triggerKey);
// 移除触发器
scheduler.unscheduleJob(triggerKey);
// 删除工作
scheduler.deleteJob(jobKey);
}
三 工作长久化
Quartz默认应用RAMJobStore
存储形式将工作存储在内存中,除了这种形式还反对应用JDBC将工作存储在数据库,为了避免工作失落,咱们个别会将工作存储在数据库中。
这里应用mysql进行存储,在quartz的源码包中找到文件tables_mysql_innodb.sql
,而后在客户端进行运行sql文件。如果嫌源码包不好下载的话,我曾经将sql文件上传至GitHub了,能够间接拜访github拉去表构造,数据表如下:
3.1 减少mysql和jdbc依赖
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.11</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
3.2 指定应用jdbc存储
quartz默认应用memory存储,这里批改成jdbc进行存储,并配置jdbc的相干信息
spring:
quartz:
job-store-type: jdbc
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/simple_fast
username: root
password: root
3.3 创立工作
启动我的项目,调用create
接口创立工作,而后数据表中就会新增工作相干的数据了。
此是spring-boot-route系列的第二十一篇文章,这个系列的文章都比较简单,次要目标就是为了帮忙首次接触Spring Boot 的同学有一个零碎的意识。本文已收录至我的github,欢送各位小伙伴star
!
github:https://github.com/binzh303/s…
点关注、不迷路
如果感觉文章不错,欢送关注、点赞、珍藏,你们的反对是我创作的能源,感激大家。
如果文章写的有问题,请不要吝惜文笔,欢送留言指出,我会及时核查批改。
如果你还想更加深刻的理解我,能够微信搜寻「Java旅途」进行关注。回复「1024」即可取得学习视频及精美电子书。每天7:30准时推送技术文章,让你的下班路不在孤单,而且每月还有送书流动,助你晋升硬实力!
发表回复