# Quartz教程 - 8 持久化与集群

为什么要持久化?

默认情况下 Quartz 是保存在内存中的,如果不做持久化,系统停止或重启,任务将丢失;

另外如果做了持久化,可以在数据库中查看到有多少 JobDetail 和 Trigger。


为什么需要集群?

因为每台服务器运行的代码是一样的,那么一个定时任务如果被多个服务器运行,就会存在重复执行,另外集群可以保证系统的高可用性,一台服务器发生故障,还能保证系统的稳定运行。


集群是必须利用数据库将 Quartz 的信息保存到数据库中的,每台服务器通过读取数据库的数据抢占执行权限,因此将Quartz数据持久化到数据库是集群的基础。因此先讲解 Quartz 的持久化。


# 8.1 持久化

Quartz 持久化需要使用数据库,并在数据库中建立一些表,我们可以将这些表建在业务数据库中,也可以将这些表建立在独立的数据库中,如果建立在独立的数据库中,那么我们的系统需要配置多个数据源。一般情况下,建立在业务相关的数据库中即可。

# 1 引入依赖

需要在 SpringBoot 项目中,引入数据库连接和数据源的依赖。

在项目的 pom.xml 中添加依赖。

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.28</version>
</dependency>

<!-- 引入Spring封装的jdbc,内部默认依赖了 HikariDataSource  数据源-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jdbc</artifactId>
</dependency>
1
2
3
4
5
6
7
8
9
10
11

# 2 创建Job

和之前的是一样的 Job 类。

MyJob.java

package com.doubibiji.springbootquartz.job;

import lombok.extern.slf4j.Slf4j;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;

@Slf4j
public class MyJob extends QuartzJobBean {
    @Override
    protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
        log.info("执行定时任务");
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14

# 3 注册Job和Trigger

和之前的操作一样,创建一个 Quartz 的配置类,在这个配置类中,创建 JobDetail 和 Trigger,并将他们添加到Spring 容器中。

Quartz.config

内容未完......