quartz系列3:作业存储类型之jdbc作业存储

一、简介:

jdbc作业存储就是将任务的相关信息存储到数据库中,好处是就算系统重启了,目前运行到第几次了这些信息都是存放在数据库中的,那么就可以继续原来的步伐把计划任务无缝地继续做下去。 坏处就是性能上比内存慢一些,毕竟数据库读取总是要慢一些的。

 

二、使用:

1、编写pom依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.xue</groupId>
    <artifactId>test</artifactId>
    <version>1.0-SNAPSHOT</version>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.5.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-quartz</artifactId>
        </dependency>
        <dependency>
            <groupId>joda-time</groupId>
            <artifactId>joda-time</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.10</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
    </dependencies>
</project>

 

2、编写application.yml

spring:
  quartz:
    job-store-type: jdbc
    properties:
      org:
        quartz:
          datasource:
            driver-class-name: com.mysql.jdbc.Driver
            url: jdbc:mysql://localhost:3306/test_quartz
            username: root
            password: 13037489030
          scheduler:
            instancName: clusteredScheduler
            instanceId: AUTO
          jobStore:
            class: org.quartz.impl.jdbcjobstore.JobStoreTX
            driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate
            useProperties: false
            isClustered: true
            tablePrefix: QRTZ_
            clusterCheckinInterval: 1000
          threadPool:
            class: org.quartz.simpl.SimpleThreadPool
            threadCount: 20
            threadPriority: 5

 

3、编写Application启动类

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;

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

 

4、编写任务类Myjob1和Myjob2

import org.joda.time.DateTime;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;
import java.util.Date;

public class MyJob1 extends QuartzJobBean {
    @Override
    protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        System.out.println("定时任务 1 开始执行......"+new DateTime().toString("HH:mm:ss"));
    }
}
import org.joda.time.DateTime;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;
import java.util.Date;

public class MyJob2 extends QuartzJobBean {
    @Override
    protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        System.out.println("定时任务 2 开始执行......"+new DateTime().toString("HH:mm:ss"));
    }
}

 

5、编写配置类

import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;
import org.quartz.*;
import org.springframework.boot.autoconfigure.quartz.QuartzDataSource;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.sql.DataSource;

@Configuration
public class QuartzConfig {

    /*
    配置数据源
     */
    @Bean
    @QuartzDataSource
    @ConfigurationProperties(prefix = "spring.quartz.properties.org.quartz.datasource")
    public DataSource dataSource(){
        return DruidDataSourceBuilder.create().build();
    }

}

 

6、编写quartz服务类

import com.task.MyJob1;
import com.task.MyJob2;
import org.quartz.*;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.Date;

@Service
public class QuartzService {
    @Resource
    private Scheduler scheduler;

    /*
    启动所有任务
     */
    public void startAllJob() throws SchedulerException {
        startJob(MyJob1.class,"job1","group1","0/2 * * * * ?");
        startJob(MyJob2.class,"job2","group2","0/5 * * * * ?");
        scheduler.start();
    }

    /*
    启动某个任务
     */
    public void startJob(Class job,String name,String group,String cron) throws SchedulerException {
        JobDetail jobDetail = JobBuilder.newJob(job).withIdentity(name,group).build();
        CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(cron);
        CronTrigger cronTrigger = TriggerBuilder.newTrigger()
                .withIdentity(name,group)
                .withSchedule(cronScheduleBuilder)
                .build();
        //调度任务jobDetail和定时器cronTrigger
        scheduler.scheduleJob(jobDetail,cronTrigger);
    }

    /*
    修改某个任务的执行时间
     */
    public boolean modifyJob(String name,String group,String time) throws SchedulerException {
        Date date = null;
        TriggerKey triggerKey = new TriggerKey(name,group);
        CronTrigger cronTrigger = (CronTrigger)scheduler.getTrigger(triggerKey);
        String oldTime = cronTrigger.getCronExpression();
        if(!oldTime.equals(time)){
            CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(time);
            CronTrigger trigger = TriggerBuilder.newTrigger()
                    .withIdentity(name,group)
                    .withSchedule(cronScheduleBuilder)
                    .build();
            date = scheduler.rescheduleJob(triggerKey,trigger);
        }
        return date!=null;
    }

    /*
    暂停所有任务
     */
    public void pauseAllJob() throws SchedulerException {
        scheduler.pauseAll();
    }

    /*
    暂停某个任务
     */
    public void pauseJob(String name,String group) throws SchedulerException {
        JobKey jobKey = new JobKey(name,group);
        JobDetail jobDetail = scheduler.getJobDetail(jobKey);
        if(jobDetail==null)
            return ;
        scheduler.pauseJob(jobKey);
    }

    /*
    恢复某个任务
     */
    public void resumeJob(String name,String group) throws SchedulerException {
        JobKey jobKey = new JobKey(name,group);
        JobDetail jobDetail = scheduler.getJobDetail(jobKey);
        if(jobDetail==null)
            return ;
        scheduler.resumeJob(jobKey);
    }

    /*
    恢复全部任务
     */
    public void resumeJobAll() throws SchedulerException {
        scheduler.resumeAll();
    }

    /*
    删除某个任务
     */
    public void deleteJob(String name,String group) throws SchedulerException {
        JobKey jobKey = new JobKey(name,group);
        JobDetail jobDetail = scheduler.getJobDetail(jobKey);
        if(jobDetail==null)
            return ;
        scheduler.deleteJob(jobKey);
    }

    /*
    获取job信息
     */
    public String getJobInfo(String name,String group) throws SchedulerException {
        TriggerKey triggerKey = new TriggerKey(name,group);
        CronTrigger cronTrigger = (CronTrigger) scheduler.getTrigger(triggerKey);
        return String.format("time:%s,state:%s",cronTrigger.getCronExpression(),scheduler.getTriggerState(triggerKey).name());
    }
}

 

7、编写接口类,用于测试任务的开启、暂停、恢复等操作

import com.service.QuartzService;
import org.quartz.SchedulerException;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;

@RestController
@RequestMapping("/quartz")
public class DemoController {

    @Resource
    private QuartzService quartzService;

    /*
    启动所有任务
     */
    @RequestMapping("/startAll")
    public void startAll(){
        try {
            quartzService.startAllJob();
        } catch (SchedulerException e) {
            e.printStackTrace();
        }
    }

    /*
    获取任务信息
     */
    @RequestMapping("/getInfo")
    public String getInfo(String name,String group){
        String info = null;
        try {
            info = quartzService.getJobInfo(name,group);
        } catch (SchedulerException e) {
            e.printStackTrace();
        }
        return info;
    }

    /*
    修改某个任务的执行时间
     */
    @RequestMapping("/modify")
    public boolean modify(String name,String group,String time){
        boolean flag = true;
        try {
            flag = quartzService.modifyJob(name,group,time);
        }catch (Exception e){
            e.printStackTrace();
        }
        return flag;
    }

    /*
    暂停某个任务
     */
    @RequestMapping("/pause")
    public void pauseJob(String name,String group){
        try {
            quartzService.pauseJob(name,group);
        } catch (SchedulerException e) {
            e.printStackTrace();
        }
    }

    /*
    暂停所有任务
     */
    @RequestMapping("/pauseAll")
    public void pauseAllJob(){
        try {
            quartzService.pauseAllJob();
        } catch (SchedulerException e) {
            e.printStackTrace();
        }
    }

    /*
    恢复某个任务
     */
    @RequestMapping("/resume")
    public void resume(String name,String group){
        try {
            quartzService.resumeJob(name,group);
        } catch (SchedulerException e) {
            e.printStackTrace();
        }
    }

    /*
    恢复全部任务
     */
    @RequestMapping("/resumeAll")
    public void resumeAll(){
        try {
            quartzService.resumeJobAll();
        } catch (SchedulerException e) {
            e.printStackTrace();
        }
    }

    /*
    删除某个任务
     */
    @RequestMapping("/delete")
    public void delete(String name,String group){
        try {
            quartzService.deleteJob(name,group);
        } catch (SchedulerException e) {
            e.printStackTrace();
        }
    }
}

 

 

三、接口测试:

http://localhost:8080/quartz/startAll  #开启所有任务

http://localhost:8080/quartz/pauseAll  #暂停所有任务

...........................


四、案例地址:

https://gitee.com/xuehengs/quartz_jdbc

 

posted @ 2020-09-30 22:48  xueheng_blog  阅读(373)  评论(0编辑  收藏  举报