SpringBoot2.0整合Quartz定时任务(持久化到数据库,更为简单的方式)

背景

仔细回想一下,上一篇文章中集成Quartz并且持久化到数据库的方式,稍微有一点烦人,那么springboot有没有提供给我们这种相对快捷的方式么?我们可以去springboot的官方看看
https://docs.spring.io/spring-boot/docs/2.1.1.RELEASE/reference/htmlsingle/#boot-features-quartz
这里就有讲,spring-boot-starter-quartz 是自动配置的。

Springboot2.0集成Quartz

这里整合很简单,一共三个步骤:

  1. pom文件添加依赖。
  2. yml文件配置。
  3. 业务逻辑直接使用

1. pom文件添加依赖

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <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>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.3.1</version>
        </dependency>
        <dependency>
            <groupId>com.mchange</groupId>
            <artifactId>c3p0</artifactId>
            <version>0.9.5.2</version>
        </dependency>
        <!--&lt;!&ndash; druid数据库连接池 &ndash;&gt;-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.10</version>
        </dependency>
    </dependencies>

其中最重要的就是spring-boot-starter-quartz,其他的依赖依据个人口味添加。

2. yml配置

yml也是springboot的一种配置文件的格式。
代码如下:

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/aipyun?serverTimezone=GMT&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true
    username: root
    password: root123
    driver-class-name: com.mysql.jdbc.Driver
    type: com.alibaba.druid.pool.DruidDataSource
    druid:
      initialSize: 2
      minIdle: 2
      maxActive: 30
      #StatViewServlet:
      #loginUsername: admin
      #loginPassword: admin
  quartz:
    #相关属性配置
    properties:
      org:
        quartz:
          scheduler:
            instanceName: DefaultQuartzScheduler
            instanceId: AUTO
          jobStore:
            class: org.quartz.impl.jdbcjobstore.JobStoreTX
            driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate
            tablePrefix: QRTZ_
            isClustered: false
            clusterCheckinInterval: 10000
            useProperties: true
          threadPool:
            class: org.quartz.simpl.SimpleThreadPool
            threadCount: 10
            threadPriority: 5
            threadsInheritContextClassLoaderOfInitializingThread: true
          dataSource:
            default:
              URL: jdbc:mysql://localhost:3306/aipyun?characterEncoding=utf-8
              user: root
              password: root123
              driver: com.mysql.jdbc.Driver

    #数据库方式
    job-store-type: jdbc
      #初始化表结构
    #jdbc:
    #initialize-schema: never

我们可以对比下这个配置文件和之前的quartz.properties的区别,基本一模一样,只不过写的格式不一样而已。有兴趣的同学可以对比看看:上一篇博客 Quartz框架介绍

3. 业务逻辑代码

和之前代码一样,这就就不啰嗦了。
可以附上对job的增删改查的代码:

    /**
     * 删除job
     *
     * @param triggerName  触发器名称
     * @param triggerGroup 触发器分组
     * @param jobName      任务名称
     * @param jobGroup     任务分组
     * @throws SchedulerException
     */
    public void deleteJob(String triggerName, String triggerGroup, String jobName, String jobGroup) throws SchedulerException {
        TriggerKey triggerKey = TriggerKey.triggerKey(triggerName, triggerGroup);
        scheduler.pauseTrigger(triggerKey);
        scheduler.unscheduleJob(triggerKey);
        JobKey jobKey = JobKey.jobKey(jobName, jobGroup);
        scheduler.deleteJob(jobKey);
    }

    /**
     * 修改定时任务
     *
     * @param oldTriggerKey 需要修改的TriggerKey 也就是唯一标识
     * @param cron          新的cron表达式
     */
    public void updateJob(TriggerKey oldTriggerKey, String cron) {
        CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cron);
        CronTrigger cronTrigger = TriggerBuilder.newTrigger()
                .withIdentity(oldTriggerKey).withSchedule(scheduleBuilder).build();
        try {
            scheduler.rescheduleJob(oldTriggerKey, cronTrigger);
        } catch (SchedulerException e) {
            e.printStackTrace();
        }
    }

    /**
     * 新增job任务
     *
     * @param jobName          job名称
     * @param jobGroupName     job分组名称
     * @param triggerName      触发器名称
     * @param triggerGroupName 触发器分组名称
     * @param jobClass         需要执行的job.class
     * @param cron             cron 表达式
     * @throws SchedulerException
     */
    public void addJob(String jobName, String jobGroupName,
                       String triggerName, String triggerGroupName, Class jobClass, String cron) throws SchedulerException {
        CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(cron);
        JobDetail jobDetail = JobBuilder.newJob(jobClass).withIdentity(jobName, jobGroupName).build();
        Trigger trigger = TriggerBuilder.newTrigger().withIdentity(triggerName, triggerGroupName)
                .withSchedule(cronScheduleBuilder).build();
        scheduler.scheduleJob(jobDetail, trigger);
    }

关于spring-boot-starter-quartz

鄙人用的开发工具是idea,可以直接查看源码,至于用eclispe的怎么查看源码我就不知道了。
我们找到Idea的External Libraries并且展开spring-boot-autoconfigure-2.0.0.RELEASE.jar,找到org.springframework.boot.autoconfigure.quartz,该目录就是SpringBoot为我们提供的Quartz自动化配置源码实现,在该目录下有如下所示几个类:
自动配置
QuartzAutoConfiguration该类是自动配置的主类,内部配置了SchedulerFactoryBean,相当于我们之前自己配的SchedulerFactoryBean类。
JobStoreType是一个枚举:表示quartz的存储方式:RAM 或者JDBC。
QuartzProperties配置类:从yml或者properties中读取配置信息。
剩下的我也不知道干嘛的 QAQ,知道了解的大佬可以给我留个言~~

总结

其实通过查看spring-boot-starter-quartz的源码,我们应该能够了解到starter这种开箱即用的方式,就是将我们之前需要自己整合的一些代码,包装成starter方式,直接使用,原理是一样的。
附上下载地址:
下载地址

  • 11
    点赞
  • 86
    收藏
    觉得还不错? 一键收藏
  • 22
    评论
当您需要将Quartz任务存储在数据库中时,可以使用Quartz提供的`JobStoreTX`和`JobStoreCMT`来实现。 首先,您需要在Spring Boot项目中添加以下依赖项: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-quartz</artifactId> </dependency> <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.3.2</version> </dependency> <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz-jobs</artifactId> <version>2.3.2</version> </dependency> ``` 接下来,您需要创建一个Quartz的配置类,用于配置Quartz的相关属性和任务: ```java @Configuration public class QuartzConfig { @Autowired private DataSource dataSource; @Autowired private ApplicationContext applicationContext; @Bean public SchedulerFactoryBean schedulerFactoryBean() { SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean(); schedulerFactoryBean.setJobFactory(springBeanJobFactory()); schedulerFactoryBean.setDataSource(dataSource); schedulerFactoryBean.setQuartzProperties(quartzProperties()); // 其他配置属性... return schedulerFactoryBean; } @Bean public SpringBeanJobFactory springBeanJobFactory() { AutowiringSpringBeanJobFactory jobFactory = new AutowiringSpringBeanJobFactory(); jobFactory.setApplicationContext(applicationContext); return jobFactory; } @Bean public Properties quartzProperties() { Properties properties = new Properties(); properties.setProperty("org.quartz.jobStore.class", "org.quartz.impl.jdbcjobstore.JobStoreTX"); properties.setProperty("org.quartz.jobStore.driverDelegateClass", "org.quartz.impl.jdbcjobstore.PostgreSQLDelegate"); properties.setProperty("org.quartz.jobStore.tablePrefix", "QRTZ_"); properties.setProperty("org.quartz.jobStore.isClustered", "false"); properties.setProperty("org.quartz.jobStore.dataSource", "quartzDataSource"); properties.setProperty("org.quartz.dataSource.quartzDataSource.driver", "org.postgresql.Driver"); properties.setProperty("org.quartz.dataSource.quartzDataSource.URL", "jdbc:postgresql://localhost:5432/quartz"); properties.setProperty("org.quartz.dataSource.quartzDataSource.user", "quartz"); properties.setProperty("org.quartz.dataSource.quartzDataSource.password", "quartz"); properties.setProperty("org.quartz.dataSource.quartzDataSource.maxConnections", "10"); return properties; } } ``` 然后,您需要创建一个定时任务的类,继承`QuartzJobBean`并实现`executeInternal`方法: ```java public class MyJob extends QuartzJobBean { @Override protected void executeInternal(JobExecutionContext context) throws JobExecutionException { // 在这里编写定时任务的逻辑 System.out.println("Hello Quartz!"); } } ``` 接下来,您可以在数据库中创建Quartz相关的表。您可以使用Quartz提供的`quartz_tables_postgres.sql`脚本来创建PostgreSQL数据库表。 最后,在您的应用程序中,您可以使用`@Scheduled`注解来触发定时任务: ```java @Component public class MyScheduledTasks { @Scheduled(cron = "0/10 * * * * ?") public void runJob() { // 在这里编写定时任务的逻辑 System.out.println("Hello Scheduled Tasks!"); } } ``` 这样,您的定时任务将会存储在数据库中,并由Quartz进行调度执行。希望对您有所帮助!如果还有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值