>  기사  >  Java  >  Quartz를 SpringBoot와 통합하는 방법

Quartz를 SpringBoot와 통합하는 방법

PHPz
PHPz앞으로
2023-05-10 18:46:06869검색

기본 종속성

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-quartz</artifactId>
    <version>2.5.2</version>
</dependency>

Quartz는 단일 애플리케이션 프로젝트에서 일반적으로 사용되는 예약된 작업 프레임워크입니다. 예약된 작업은 주로 다음과 같이 나눌 수 있습니다:

  • 메모리의 작업: 일반적으로 프로젝트 내부에 정의되고 저장되며, 프로젝트가 다시 시작되면 작업이 자동으로 실행되지 않으면 다시 시작되지 않습니다.

  • 지속적 작업: 작업의 특성을 데이터베이스에 저장한 후 원래 실행 중인 작업을 다시 읽고 계속 실행할 수 있습니다.

cron 표현식

옥수수는 작업이 트리거되는 시간을 제어하는 ​​데 사용됩니다. corn是用来控制任务触发的时刻。

我列举一些常用的:

  • 每秒钟触发

"* * * * * *":
  • 每隔5秒执行一次

*/5 * * * * ?
  • 每分钟触发

"0 * * * * ?"
  • 每一小时触发

"0 * * * * ?"
  • 每天10点触发一次

"0 0 10 * * ?"
  • 每天0点触发一次

"0 0 0 * * ?"

通用

需要在启动类上加上@EnableScheduling注解。

内存任务

工程启动时就在执行的任务

直接定义一个执行任务,例如:

每秒都输出测试

@Service
public class ScheduleTest {

    @Scheduled(cron = "0/1 * * * * *")
    public void test() {
        System.out.println("测试");
    }
}

启动类:

@SpringBootApplication
@EnableScheduling
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

启动后看控制台中就会输出相应的内容。

手动控制某个任务

这里需要我们自己定义任务。

定义任务

通过实现Job接口,即可定义一个任务,并且我们可以手动去控制这个任务的开启。

public class SimpleJob implements Job {
    @Override
    public void execute(JobExecutionContext context) {
        System.out.println("自定义任务");
    }
}

借助Web-Controller去开启该任务

导入依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <version>2.3.6.RELEASE</version>
</dependency>

编写Controller,这是一个固定的写法。

  • 指定任务: JobBuilder.newJob(任务.class) .withIdentity(任务名, 任务组).build();

  • 指定cron表达式,创建Trigger:

    • CronScheduleBuilder.cronSchedule(cron表达式);

    • TriggerBuilder.newTrigger().withIdentity(启动器的名字, 启动器的分组) .withSchedule(cron).build();

  • 调用任务:scheduler.scheduleJob(任务类型对象, 启动器对象)

/**
 * @ClassName
 * @Description
 * @Author:chengyunlai
 * @Date
 * @Version 1.0
 **/
@RestController
public class DynamicScheduleController {

    @Autowired
    private Scheduler scheduler;

    @GetMapping("/addSchedule")
    public String addSchedule() throws SchedulerException {
        int random = ThreadLocalRandom.current().nextInt(1000);
        // 1. 创建JobDetail,指定定时任务实现类的类型
        JobDetail jobDetail = JobBuilder.newJob(SimpleJob.class)
                .withIdentity("test-schedule" + random, "test-group").build();
        // 2. 创建Trigger,并指定每3秒执行一次
        CronScheduleBuilder cron = CronScheduleBuilder.cronSchedule("0/3 * * * * ?");

        Trigger trigger = TriggerBuilder.newTrigger().withIdentity("test-trigger" + random, "test-trigger-group")
                .withSchedule(cron).build();

        // 3. 调度任务
        scheduler.scheduleJob(jobDetail, trigger);
        return "success";
    }

通过浏览器输入项目的地址,一般默认是localhost:8080/addSchedule,输入后即可看到控制台输出了任务执行的输出内容。

持久化

如果工程重启了,上面的SimpleJob这个定时任务并不会重新启动。解决的办法就是将任务持久化,Quartz提供了解决方案,SpringBoot简化了这个操作。我们只需要配置好:数据库、数据源、操作数据库的JDBC即可。

依赖:

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.2.8</version>
</dependency>
  • 使用mysql数据库:导入它的驱动,mysql-connector-java。

  • 使用Druid作为我们的数据源:druid。

  • 使用spring-jdbc,帮助我们自动将任务信息存入到数据库中。

配置

# 设置将定时任务的信息保存到数据库
spring.quartz.job-store-type=jdbc

# 每次应用启动的时候都初始化数据库表结构
# 如果 spring.quartz.jdbc.initialize-schema 设置为 always 的话有个问题:每次重启应用的时候,跟 Quartz 相关的表会被删除重建!
# 所以为了避免表被重复创建,我们可以提前创建表,然后将其指定为never
spring.quartz.jdbc.initialize-schema=never

# 数据库配置
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/scheduled?serverTimezone=GMT%2B8&useSSL=false&characterEncoding=utf-8
spring.datasource.username=root
spring.datasource.password=root

Quartz为我们准备了sql数据表

官网:Downloads (quartz-scheduler.org)

以我:quartz-2.3.0-SNAPSHOT为例子:

下载源码后,找到jdbcjobstore这个目录:

quartz-2.3.0-SNAPSHOTsrcorgquartzimpljdbcjobstore

然后会有一系列的sql文件,找到和你数据库匹配的那个sql文件即可,我用的是mysql。

Quartz를 SpringBoot와 통합하는 방법

执行SQL文件建表,我的数据库名是:scheduled,各位从我的url中应该也能看出来。

建表完成后,所有配置工作结束了,启动程序,重新在浏览器中输入:localhost:8080/addSchedule,然后刷新一下数据库,就会发现任务被持久化了,此时重启工程后,该任务依旧会自动执行。

暂停任务和删除任务

我们在手动开启该任务的时候会指定:

  • 任务的名称和组

JobDetail jobDetail = JobBuilder.newJob(SimpleJob.class) .withIdentity(任务名,任务组).build();

在暂停和恢复任务时,就需要用JobKey.jobKey(任务名,任务组),得到一个JobKey,然后使用scheduler.pauseJob(jobkey)即可暂停任务;scheduler.resumeJob(jobKey)恢复任务。

  • 删除任务的时候需要将任务和Trigger都删除,而在上面我们可以拿到这个jobkey表示任务,我们也需要拿到trigger,同样的我们也定义过启动器的名字和分组。

`TriggerBuilder.newTrigger().withIdentity(启动器的名字, 启动器的分组) .withSchedule(cron).build();`

TriggerKey.triggerKey((启动器的名字, 启动器的分组);也可以拿到trigger

일반적으로 사용되는 몇 가지 항목을 나열합니다. 🎜🎜🎜🎜1초마다 트리거🎜🎜🎜
// 暂停
@GetMapping("/pauseSchedule")
public String pauseSchedule(String jobName, String jobGroup) throws SchedulerException {
    JobKey jobKey = JobKey.jobKey(jobName, jobGroup);
    // 获取定时任务
    JobDetail jobDetail = scheduler.getJobDetail(jobKey);
    if (jobDetail == null) {
        return "error";
    }
    scheduler.pauseJob(jobKey);
    return "success";
}

// 恢复
@GetMapping("/remuseSchedule")
public String remuseSchedule(String jobName, String jobGroup) throws SchedulerException {
    JobKey jobKey = JobKey.jobKey(jobName, jobGroup);
    // 获取定时任务
    JobDetail jobDetail = scheduler.getJobDetail(jobKey);
    if (jobDetail == null) {
        return "error";
    }
    scheduler.resumeJob(jobKey);
    return "success";
}

// 删除定时任务
@GetMapping("/removeSchedule")
public String removeSchedule(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 "error";
    }
    // 停止触发器
    scheduler.pauseTrigger(triggerKey);
    // 移除触发器
    scheduler.unscheduleJob(triggerKey);
    // 删除任务
    scheduler.deleteJob(jobKey);
    return "success";
}
🎜🎜🎜5초마다 실행🎜🎜🎜rrreee🎜🎜🎜1분마다 트리거🎜🎜🎜rrreee🎜 🎜 🎜매시간 트리거 🎜🎜🎜 rrreee🎜🎜🎜하루에 한 번 10시에 트리거됨🎜🎜🎜rrreee🎜🎜🎜하루에 한 번 0시에 트리거됨🎜🎜🎜rrreee🎜General🎜🎜 @EnableScheduling을 추가해야 함 > 시작 클래스에 대한 주석입니다. 🎜🎜메모리 작업🎜

프로젝트 시작 시 실행되는 작업

🎜실행 작업을 직접 정의합니다. 예: 🎜🎜1초마다 test 출력🎜rrreee🎜시작 클래스: 🎜 rrreee🎜시작하면 해당 콘텐츠가 콘솔에 출력됩니다. 🎜

작업 수동 제어

🎜여기서 작업을 직접 정의해야 합니다. 🎜

작업 정의

🎜 Job 인터페이스를 구현하여 작업을 정의하고 이 작업 열기를 수동으로 제어할 수 있습니다. 🎜rrreee

이 작업을 시작하려면 웹 컨트롤러를 사용하세요

🎜종속성 가져오기: 🎜rrreee🎜컨트롤러 작성, 이는 고정된 작성 방법입니다. 🎜🎜🎜🎜작업 지정: JobBuilder.newJob(task.class) .withIdentity(task name, task group).build();🎜🎜🎜🎜cron 표현식을 지정하고 트리거를 생성합니다. 🎜🎜
    🎜🎜CronScheduleBuilder.cronSchedule(cron 표현식);🎜🎜🎜🎜TriggerBuilder.newTrigger().withIdentity( 런처, 스타터 그룹화) .withSchedule(cron).build();🎜🎜🎜🎜🎜작업 호출: scheduler.scheduleJob(작업 유형 개체, 시작 개체)🎜🎜🎜rrreee 🎜브라우저를 통해 프로젝트의 주소를 입력하세요. 기본값은 일반적으로 localhost:8080/addSchedule입니다. 입력 후 콘솔에 작업 실행의 출력 내용을 볼 수 있습니다. 🎜🎜Persistence🎜🎜프로젝트가 다시 시작되면 위의 예약된 작업 SimpleJob은 다시 시작되지 않습니다. 해결책은 작업을 유지하는 것입니다. Quartz는 이 작업을 단순화합니다. 데이터베이스를 운영하려면 데이터베이스, 데이터 소스, JDBC만 구성하면 됩니다. 🎜🎜종속성: 🎜rrreee🎜🎜🎜mysql 데이터베이스 사용: 해당 드라이버 mysql-connector-java를 가져옵니다. 🎜🎜🎜🎜Druid를 데이터 소스로 사용: druid. 🎜🎜🎜🎜spring-jdbc를 사용하면 작업 정보를 데이터베이스에 자동으로 저장할 수 있습니다. 🎜🎜🎜

    구성

    rrreee

    Quartz가 우리를 위해 SQL 데이터 테이블을 준비했습니다

    🎜공식 웹사이트: 다운로드(quartz-scheduler.org)🎜🎜사용: quartz-2.3.0-SNAPSHOT 예: 🎜🎜소스 코드를 다운로드한 후 jdbcjobstore 디렉터리를 찾으세요. 🎜🎜quartz-2.3.0-SNAPSHOTsrcorgquartzimpljdbcjobstore🎜🎜 그런 다음 일련의 sql code> 파일에서 내가 사용하는 데이터베이스와 일치하는 sql 파일을 찾으세요. 🎜🎜<img src="https://img.php.cn/upload/article/000/000/164/168371556976615.png" alt="SpringBoot는 Quartz를 어떻게 통합합니까?">🎜🎜SQL 파일을 실행하여 생성 테이블, I 데이터베이스 이름은 <code>scheduled입니다. 내 URL에서 볼 수 있습니다. 🎜🎜테이블 생성이 완료되면 모든 구성 작업이 완료됩니다. 프로그램을 시작하고 브라우저에 localhost:8080/addSchedule을 다시 입력한 다음 데이터베이스를 새로 고치면 작업이 표시됩니다. 이 시점에서 프로젝트를 다시 시작한 후에도 작업은 계속 자동으로 실행됩니다. 🎜🎜작업 일시 중지 및 작업 삭제🎜🎜작업을 수동으로 열 때 다음을 지정합니다: 🎜🎜🎜🎜작업의 이름과 그룹🎜🎜🎜rrreee🎜작업을 일시 중지하고 다시 시작할 때 를 사용해야 합니다. JobKey.jobKey(작업 이름, 작업 그룹), JobKey를 가져온 다음 scheduler.pauseJob(jobkey)를 사용하여 작업을 일시 중지합니다. Scheduler.resumeJob( jobKey)작업을 재개합니다. 🎜🎜🎜🎜작업을 삭제할 때 작업과 트리거를 모두 삭제해야 합니다. 위에서 작업을 나타내는 jobkey도 얻을 수 있습니다. 런처 이름과 그룹도 정의했습니다. 🎜🎜🎜rrreee🎜TriggerKey.triggerKey((런처 이름, 런처 그룹);런처를 나타내는 trigger를 얻을 수도 있습니다.🎜
    • 通过以下顺序完整删除任务

      • scheduler.deleteJob(jobKey);

      • scheduler.unscheduleJob(triggerKey);

      • scheduler.pauseTrigger(triggerKey);

      • // 停止触发器

      • // 移除触发器

      • // 删除任务

    // 暂停
    @GetMapping("/pauseSchedule")
    public String pauseSchedule(String jobName, String jobGroup) throws SchedulerException {
        JobKey jobKey = JobKey.jobKey(jobName, jobGroup);
        // 获取定时任务
        JobDetail jobDetail = scheduler.getJobDetail(jobKey);
        if (jobDetail == null) {
            return "error";
        }
        scheduler.pauseJob(jobKey);
        return "success";
    }
    
    // 恢复
    @GetMapping("/remuseSchedule")
    public String remuseSchedule(String jobName, String jobGroup) throws SchedulerException {
        JobKey jobKey = JobKey.jobKey(jobName, jobGroup);
        // 获取定时任务
        JobDetail jobDetail = scheduler.getJobDetail(jobKey);
        if (jobDetail == null) {
            return "error";
        }
        scheduler.resumeJob(jobKey);
        return "success";
    }
    
    // 删除定时任务
    @GetMapping("/removeSchedule")
    public String removeSchedule(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 "error";
        }
        // 停止触发器
        scheduler.pauseTrigger(triggerKey);
        // 移除触发器
        scheduler.unscheduleJob(triggerKey);
        // 删除任务
        scheduler.deleteJob(jobKey);
        return "success";
    }

위 내용은 Quartz를 SpringBoot와 통합하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제