前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SpringBoot3集成Quartz极简版

SpringBoot3集成Quartz极简版

作者头像
郭顺发
发布2023-07-24 21:31:23
5540
发布2023-07-24 21:31:23
举报
文章被收录于专栏:pandacode_cnpandacode_cn

文章项目:Github Project

前提

文章所用版本:

  • SpringBoot 3.1.1
  • Quartz 2.3.2
  • JDK 17

集成Quartz

引入quartz maven库

代码语言:javascript
复制
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-quartz</artifactId>
</dependency>

SpringBoot用的是3.1.1,使用spring-boot-starter-quartz库,quartz版本默认为2.3.2。

image-20230718091850936
image-20230718091850936

添加Quartz配置文件

将quartz.properties文件添加到resource目录下。

(quartz.properties文件不是必须的,但要使用除最基本的配置之外的任何配置,它必须位于类路径上。)

image-20230718092052636
image-20230718092052636

配置

这是最重要的一点!Quartz是一个可配置的应用程序。配置 Quartz 的最佳方法是编辑 quartz.properties 文件,并将其放在应用程序的类路径中。

建议创建自己的 quartz.properties 文件,而不是复制其他案例的配置,这样更整洁。

可用属性的完整文档可在 Quartz 配置参考中找到。

为了快速启动和运行,基本的 quartz.properties 如下所示:

代码语言:javascript
复制
org.quartz.scheduler.instanceName = MyScheduler
org.quartz.threadPool.threadCount = 3
org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore

此配置创建的调度程序具有以下特征:

  • org.quartz.scheduler.instanceName - 此调度程序的名称将是“MyScheduler”。
  • org.quartz.threadPool.threadCount - 线程池中有 3 个线程,这意味着最多可以同时运行 3 个作业。
  • org.quartz.jobStore.class - Quartz 的所有数据,例如作业和触发器的详细信息,都保存在内存中(而不是保存在数据库中)。 即使您有一个数据库并希望将其与Quartz一起使用,我也建议您在通过数据库打开一个全新的维度之前,先让Quartz与RamJobStore合作。

启动示例应用程序

添加测试类QuartzTest

代码语言:javascript
复制
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.impl.StdSchedulerFactory;
import static org.quartz.JobBuilder.*;
import static org.quartz.TriggerBuilder.*;
import static org.quartz.SimpleScheduleBuilder.*;

public class QuartzTest {

  public static void main(String[] args) {

      try {
          // Grab the Scheduler instance from the Factory
          Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();

          // and start it off
          scheduler.start();

          scheduler.shutdown();

      } catch (SchedulerException se) {
          se.printStackTrace();
      }
  }
}

请注意代码示例中的静态导入;这些将在下面的代码示例中发挥作用。

如果您尚未设置日志记录,则所有日志都将发送到控制台,您的输出将如下所示:

代码语言:javascript
复制
09:24:01.268 [main] INFO org.quartz.impl.StdSchedulerFactory -- Using default implementation for ThreadExecutor
09:24:01.311 [main] INFO org.quartz.core.SchedulerSignalerImpl -- Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl
09:24:01.311 [main] INFO org.quartz.core.QuartzScheduler -- Quartz Scheduler v.2.3.2 created.
09:24:01.312 [main] INFO org.quartz.simpl.RAMJobStore -- RAMJobStore initialized.
09:24:01.313 [main] INFO org.quartz.core.QuartzScheduler -- Scheduler meta-data: Quartz Scheduler (v2.3.2) 'MyScheduler' with instanceId 'NON_CLUSTERED'
  Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally.
  NOT STARTED.
  Currently in standby mode.
  Number of jobs executed: 0
  Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 3 threads.
  Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered.

09:24:01.313 [main] INFO org.quartz.impl.StdSchedulerFactory -- Quartz scheduler 'MyScheduler' initialized from default resource file in Quartz package: 'quartz.properties'
09:24:01.313 [main] INFO org.quartz.impl.StdSchedulerFactory -- Quartz scheduler version: 2.3.2
09:24:01.314 [main] INFO org.quartz.core.QuartzScheduler -- Scheduler MyScheduler_$_NON_CLUSTERED started.
09:24:01.315 [main] INFO org.quartz.core.QuartzScheduler -- Scheduler MyScheduler_$_NON_CLUSTERED shutting down.
09:24:01.315 [main] INFO org.quartz.core.QuartzScheduler -- Scheduler MyScheduler_$_NON_CLUSTERED paused.
09:24:01.315 [main] INFO org.quartz.core.QuartzScheduler -- Scheduler MyScheduler_$_NON_CLUSTERED shutdown complete.

为了更有效的展示定时器的呈现效果,这里再加一下。

调整QuartzTest

代码语言:javascript
复制
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.Trigger;
import org.quartz.impl.StdSchedulerFactory;
import static org.quartz.JobBuilder.*;
import static org.quartz.TriggerBuilder.*;
import static org.quartz.SimpleScheduleBuilder.*;

public class QuartzTest {

    public static void main(String[] args) {

        try {
            // 从工厂获取调度程序实例
            Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();

            // 并启动它
            scheduler.start();

            // 定义作业并将其与我们的 HelloJob 类绑定
            JobDetail job = newJob(HelloJob.class)
                    .withIdentity("job1", "group1")
                    .build();

            // 触发作业立即运行,然后每 3 秒重复一次
            Trigger trigger = newTrigger()
                    .withIdentity("trigger1", "group1")
                    .startNow()
                    .withSchedule(simpleSchedule()
                            .withIntervalInSeconds(3)
                            .repeatForever())
                    .build();

            // 告诉quartz使用我们的触发器安排作业
            scheduler.scheduleJob(job, trigger);

            Thread.sleep(60000);

            scheduler.shutdown();

        } catch (SchedulerException se) {
            se.printStackTrace();
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }
}

使用 StdSchedulerFactory.getDefaultScheduler() 获取调度程序后,应用程序在调用 scheduler.shutdown() 之前不会终止,因为会有活动线程。

添加定时任务类HelloJob

代码语言:javascript
复制
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

public class HelloJob implements Job {
    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        try {
            System.out.println("我是HelloJob,我开始执行。");
            Thread.sleep(600);
            System.out.println("我是HelloJob,我执行结束。");
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }
}

控制台输出结果

代码语言:javascript
复制
09:36:46.942 [main] INFO org.quartz.impl.StdSchedulerFactory -- Using default implementation for ThreadExecutor
09:36:46.973 [main] INFO org.quartz.core.SchedulerSignalerImpl -- Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl
09:36:46.973 [main] INFO org.quartz.core.QuartzScheduler -- Quartz Scheduler v.2.3.2 created.
09:36:46.974 [main] INFO org.quartz.simpl.RAMJobStore -- RAMJobStore initialized.
09:36:46.976 [main] INFO org.quartz.core.QuartzScheduler -- Scheduler meta-data: Quartz Scheduler (v2.3.2) 'MyScheduler' with instanceId 'NON_CLUSTERED'
  Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally.
  NOT STARTED.
  Currently in standby mode.
  Number of jobs executed: 0
  Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 3 threads.
  Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered.

09:36:46.976 [main] INFO org.quartz.impl.StdSchedulerFactory -- Quartz scheduler 'MyScheduler' initialized from default resource file in Quartz package: 'quartz.properties'
09:36:46.976 [main] INFO org.quartz.impl.StdSchedulerFactory -- Quartz scheduler version: 2.3.2
09:36:46.977 [main] INFO org.quartz.core.QuartzScheduler -- Scheduler MyScheduler_$_NON_CLUSTERED started.
我是HelloJob,我开始执行。
我是HelloJob,我执行结束。
我是HelloJob,我开始执行。
我是HelloJob,我执行结束。
我是HelloJob,我开始执行。
我是HelloJob,我执行结束。
我是HelloJob,我开始执行。
我是HelloJob,我执行结束。
我是HelloJob,我开始执行。
我是HelloJob,我执行结束。
我是HelloJob,我开始执行。
我是HelloJob,我执行结束。
我是HelloJob,我开始执行。
我是HelloJob,我执行结束。
我是HelloJob,我开始执行。
我是HelloJob,我执行结束。
我是HelloJob,我开始执行。
我是HelloJob,我执行结束。
我是HelloJob,我开始执行。
我是HelloJob,我执行结束。
我是HelloJob,我开始执行。
我是HelloJob,我执行结束。
我是HelloJob,我开始执行。
我是HelloJob,我执行结束。
我是HelloJob,我开始执行。
我是HelloJob,我执行结束。
我是HelloJob,我开始执行。
我是HelloJob,我执行结束。
我是HelloJob,我开始执行。
我是HelloJob,我执行结束。
我是HelloJob,我开始执行。
我是HelloJob,我执行结束。
我是HelloJob,我开始执行。
我是HelloJob,我执行结束。
我是HelloJob,我开始执行。
我是HelloJob,我执行结束。
我是HelloJob,我开始执行。
我是HelloJob,我执行结束。
我是HelloJob,我开始执行。
我是HelloJob,我执行结束。
我是HelloJob,我开始执行。
09:37:47.047 [main] INFO org.quartz.core.QuartzScheduler -- Scheduler MyScheduler_$_NON_CLUSTERED shutting down.
09:37:47.047 [main] INFO org.quartz.core.QuartzScheduler -- Scheduler MyScheduler_$_NON_CLUSTERED paused.
09:37:47.048 [main] INFO org.quartz.core.QuartzScheduler -- Scheduler MyScheduler_$_NON_CLUSTERED shutdown complete.
我是HelloJob,我执行结束。
与目标 VM 断开连接, 地址为: ''127.0.0.1:60612',传输: '套接字''

进程已结束,退出代码0

参考文章

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2023-07-18 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前提
  • 集成Quartz
    • 引入quartz maven库
      • 添加Quartz配置文件
        • 配置
      • 启动示例应用程序
      • 参考文章
      相关产品与服务
      数据库
      云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档