定时任务之Springboot整合Quartz详解

本文介绍了Quartz定时任务框架,包括其作用、组件详解(如Scheduler、Job、Trigger等)、持久化策略以及如何在SpringBoot项目中入门使用。还探讨了与其他开源引擎框架结合的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景:最近公司一个需求用到定时任务进行采集操作,故写文章来记录一下定时任务的基本概念

一、什么是Quartz

quartz是一个定时调度的框架,指定时间内触发执行某个动作;它完全由 Java 写成,并设计用于 J2SE 和 J2EE 应用中。

二、为什么使用Quartz

2.1、为什么要用定时任务

1)无需手动触发 :无需页面(人工)触发动作;
2)执行时间准确:会在准确的时间内进行业务处理;
3)低耦合:单独为一个动作体,可以自行开关,不影响其他业务功能;

2.2、为什么使用Quartz

1)目前公司使用较多的定时任务框架为xxl-Job,elastic-Job,此框架都是基于Quartz进行二次开发;
2)有些传统互联网公司定时任务框架还是使用Quartz

三、常见开源定时任务的框架的异同

在这里插入图片描述

四、Quartz的组件

在这里插入图片描述

1)Scheduler(调度器):Scheduler 是 Quartz 的核心组件,它负责管理和调度所有的任务。Scheduler 可以启动、停止、暂停和恢复任务的执行,还可以配置任务的触发条件和执行计划。
2)Job(任务):Job 是需要被调度执行的实际任务。您可以定义自己的 Job 类,实现自己的业务逻辑,并将其注册到 Scheduler 中。Quartz 提供了不同类型的 Job,如无状态的 Job、有状态的 Job 等,以满足不同的需求。
3)Trigger(触发器):Trigger 负责定义任务的触发条件,即何时触发任务的执行。您可以为每个 Job 关联一个或多个 Trigger,根据时间表达式(如 Cron 表达式)或者特定的时间间隔来配置触发器。
4)JobDetail(任务详情):JobDetail 是与 Job 相关联的详细信息,包括 Job 的名称、所属的 Job 类、Job 的身份标识等。每个 Job 都有一个对应的 JobDetail。
5)JobStore(任务存储):JobStore 是 Quartz 的持久化机制,负责将任务和调度相关的信息存储到数据库或其他存储介质中。这样即使应用程序重启或者服务器关闭,已经配置的调度任务仍然可以得到保留。
6)Listener(监听器):Quartz 提供了丰富的监听器接口,让您可以监控任务的状态变化、执行情况以及异常事件。通过实现 Quartz 的监听器接口,您可以在任务执行前后、暂停和恢复、出现错误等情况下执行额外的逻辑。
7)ThreadPool(线程池):Scheduler 使用线程池来并发执行任务,提高任务的处理效率。Quartz 允许您配置线程池的大小、类型和特性,以适应不同的负载情况。

三大核心组件:
1)任务Job:即想要调用的任务类,需要实现org.quartz.job接口,并重写execute()方法,任务调度时会执行execute()方法。(最新版本实现QuartzJobBean类,重写executeInternal方法)
2)触发器Trigger:即执行任务的触发器,当满足什么条件时会去执行你的任务Job,主要分为根据时长间隔执行的SimpleTrigger和根据日历执行的CronTrigger。
3)调度器Scheduler:即将Trigger和Job绑定之后,根据Trigger中的设定,负责进行Job调度的组件。

五、Quartz持久化

5.1、为什么要持久化?

当程序突然被中断时,如断电,内存超出时,很有可能造成任务的丢失。可以将调度信息存储到数据库里面,进行持久化,当程序被中断后,再次启动,仍然会保留中断之前的数据,继续执行,而并不是重新开始。

5.2、Quartz提供了两种持久化方式

Quartz提供两种基本作业存储类型:

1)RAMJobStore
在默认情况下Quartz将任务调度的运行信息保存在内存中,这种方法提供了最佳的性能,因为内存中数据访问最快。不足之处是缺乏数据的持久性,当程序路途停止或系统崩溃时,所有运行的信息都会丢失。

2)JobStoreTX (分布式方式一般采用此种方式,持久化到数据库中)
所有的任务信息都会保存到数据库中,可以控制事物,还有就是如果应用服务器关闭或者重启,任务信息都不会丢失,并且可以恢复因服务器关闭或者重启而导致执行失败的任务。

六、Quartz单实例的入门(大致流程,详细细节可以查看官网)

6.1、引入pom

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

6.2、定义Job

只需要继承QuartzJobBean,并重载executeInternal方法即可定义你自己的Job执行逻辑

@Slf4j
public class HelloJob extends QuartzJobBean {

    @Override
    protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
        // get parameters
        context.getJobDetail().getJobDataMap().forEach(
                (k, v) -> log.info("param, key:{}, value:{}", k, v)
        );
        // your logics
        log.info("Hello Job执行时间: " + new Date());
    }
}

6.3、配置Job

JobDetail, Trigger, Schedule(这里采用CronScheduleBuilder)

/**
 * @author pdai
 */
@Configuration
public class QuartzConfig {

    @Bean("helloJob")
    public JobDetail helloJobDetail() {
        return JobBuilder.newJob(HelloJob.class)
                .withIdentity("DateTimeJob")
                .usingJobData("msg", "Hello Quartz")
                .storeDurably()//即使没有Trigger关联时,也不需要删除该JobDetail
                .build();
    }

    @Bean
    public Trigger printTimeJobTrigger() {
        // 每秒执行一次
        CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule("0/1 * * * * ?");
        return TriggerBuilder.newTrigger()
                .forJob(helloJobDetail())
                .withIdentity("quartzTaskService")
                .withSchedule(cronScheduleBuilder)
                .build();
    }
}

6.4、测试定时任务

ps:Quartz分布式案例进入下方借鉴文章查看

七、开源引擎框架与业务如何结合使用

总结:
常见引擎框架:定时任务引擎quartz、规则引擎drools、流程引擎acitiviti等与业务结合的时候,需要在指定的步骤中对业务表进行操作,就可以实现将所需要的信息存入到业务表中,后续把相应的业务表信息与引擎表信息关联就可。例如下方是定时任务执行的类(需要继承QuartzJobBean),此类中就可以进行业务的操作。

/**
 * @date 2023/7/11
 * 定时任务实现类
 */
@Slf4j
public class DataHandler extends QuartzJobBean {

    @Autowired
    private IDataLogService dataLogService;


    // 定时任务执行的类
    @Override
    protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
        // 1、context对象可以获取任务id等信息
        // 2、业务操作(比如操作业务表,进行采集任务后,再次更新业务表的采集状态)
        dataLogService.update();
        ...
    }
}

借鉴文章(包含Springboot集成Quartz分布式案例)
借鉴文章(W3Cschool)

### 回答1: 好的,下面是关于使用Spring BootQuartz实现定时任务的简介: Quartz是一个流行的Java定时任务框架,可以在应用程序中执行各种定时任务,如定期备份、数据抽取和数据分析等。而Spring Boot是一个快速开发框架,提供了方便的集成Quartz的方式。 要使用Spring BootQuartz实现定时任务,首先需要在pom.xml文件中添加QuartzSpring Boot Quartz的依赖项。然后,定义一个定时任务,可以使用注解@Scheduled来指定任务的执行时间。例如: ```java @Component public class MyScheduler { @Scheduled(cron = "0 0/10 * * * ?") public void myTask() { //执行定时任务的代码 } } ``` 上述代码表示每隔10分钟执行一次myTask()方法。然后,在Spring Boot的主类中,使用@EnableScheduling注解来开启定时任务的支持。例如: ```java @SpringBootApplication @EnableScheduling public class MyApp { public static void main(String[] args) { SpringApplication.run(MyApp.class, args); } } ``` 最后,启动应用程序,定时任务将按照预定时间自动执行。如果需要更高级的定时任务控制,还可以使用Quartz的其他功能,如JobDetail和Trigger等。 ### 回答2: SpringBoot是一个开源的Java开发框架,它提供了很多有用的工具和插件,其中之一便是定时任务quartzquartz是一款功能强大的开源调度框架,它提供了简单易用的任务调度机制,支持多线程和分布式部署,可以满足大部分的调度需求。 在SpringBoot中,我们可以很方便地使用quartz来实现定时任务。以下是使用SpringBootquartz实现定时任务的基本步骤: 1. 在pom.xml文件中添加quartz的依赖项: ``` <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-quartz</artifactId> </dependency> ``` 2. 创建一个任务类,实现Job接口,并实现execute方法来定义任务逻辑: ``` @Component public class MyTask implements Job { @Override public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { // 定时任务的执行逻辑 } } ``` 3. 在配置文件中定义任务调度器,并为任务分配cron表达式: ``` spring: quartz: job-store-type: jdbc properties: org.quartz.scheduler.instanceName: MyScheduler org.quartz.threadPool.threadCount: 5 job-details: myJob: durability: true requestsRecovery: true trigger-details: myTrigger: cron: 0 0/1 * * * ? job-name: myJob job-data-map: name: world ``` 4. 在任务执行类中,使用@Scheduled注解来指定任务的执行时间: ``` @Component public class MyTask { @Scheduled(cron = "0 0/1 * * * ?") public void doTask(){ // 定时任务的执行逻辑 } } ``` 以上4种方法都是使用SpringBootquartz实现定时任务的简单示例,根据实际需求可以进行相应调整和扩展。总的来说,使用springbootquartz实现定时任务非常方便,能够让我们更加轻松地管理、调度和执行任务,提高开发效率和质量。 ### 回答3: Spring Boot是一款快速构建基于Spring应用的工具,可帮助简化开发和部署。在Spring Boot中,与Quartz相比,Scheduled定时任务通常是首选的。但是,Quartz比Scheduled更灵活、功能更强大、配置更灵活,因此在一些特殊情况下,使用Quartz进行定时任务调度是比较必要的。 Quartz是用Java语言编写的一个开源的调度框架,其主要用于在一个预定义的时间间隔内重复执行某个任务,或者在特定时间点执行某个任务。Quartz提供了众多功能,比如支持分布式定时任务管理、支持动态创建/删除任务、支持时间表达式、状态存储、监控和事件触发等等。 Spring Boot集成了Quartz非常容易,只需要在Spring Boot项目中添加Quartz相关依赖,在Spring Boot配置文件中增加Quartz配置即可。以下是一个完整的Spring Boot集成Quartz的示例代码: 1.在pom.xml中添加QuartzSpring Boot Starter Web依赖: ``` <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>${quartz.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> </dependency> ``` 2.在配置文件中增加Quartz相关配置: ``` spring.quartz.job-store-type=memory spring.quartz.properties.org.quartz.threadPool.threadCount=10 spring.quartz.properties.org.quartz.jobStore.class=org.quartz.simpl.RAMJobStore ``` 3.编写定时任务处理类: ``` @Component public class JobScheduler { @Autowired private Scheduler scheduler; @Scheduled(cron = "0 0/1 * * * ?") public void doSomething() { JobDetail jobDetail = buildJobDetail(); Trigger trigger = buildJobTrigger(jobDetail); try { scheduler.scheduleJob(jobDetail, trigger); } catch (SchedulerException e) { e.printStackTrace(); } } private JobDetail buildJobDetail() { JobDataMap jobDataMap = new JobDataMap(); jobDataMap.put("key", "value"); return JobBuilder.newJob(Job.class) .withIdentity(UUID.randomUUID().toString(), "job-group") .withDescription("sample job") .usingJobData(jobDataMap) .storeDurably(true) .build(); } private Trigger buildJobTrigger(JobDetail jobDetail) { return TriggerBuilder.newTrigger() .forJob(jobDetail) .withIdentity(UUID.randomUUID().toString(), "trigger-group") .withDescription("sample trigger") .withSchedule(CronScheduleBuilder.cronSchedule("0 0/1 * * * ?")) .build(); } } ``` 虽然Quartz需要对定时任务进行配置,但是它提供了更为灵活的条件和任务调度,非常适合在实际生产环境中使用。总之,使用Spring Boot集成Quartz可以非常方便地实现定时任务的调度,既简单又强大,可以大大提高应用的效率和可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值