首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Quartz + Spring Boot:并发执行多个作业

Quartz 是一个 Java 库,用于在应用程序中调度和执行作业。它允许你在特定时间或按照特定时间间隔执行任务。Spring Boot 是一个用于创建独立的、生产级别的 Spring 应用程序的框架。结合使用 Quartz 和 Spring Boot 可以实现强大的定时任务调度功能。

基础概念

Quartz:

  • Job: 定义需要执行的任务。
  • Trigger: 定义任务何时执行的规则。
  • Scheduler: 负责管理 Job 和 Trigger,并根据 Trigger 的规则执行 Job。

Spring Boot:

  • 自动配置: 简化 Spring 应用程序的配置过程。
  • 依赖注入: 简化对象的创建和管理。

优势

  1. 灵活性: 可以精确控制任务的执行时间和频率。
  2. 可靠性: Quartz 提供了持久化机制,确保任务在应用重启后仍然可以继续执行。
  3. 可扩展性: 可以轻松集成到 Spring Boot 应用程序中,并利用 Spring 的强大功能。
  4. 并发支持: 支持同时执行多个任务,提高系统的处理能力。

类型

  • SimpleTrigger: 简单触发器,用于指定任务在特定时间点或按照固定间隔执行。
  • CronTrigger: 基于 Cron 表达式的触发器,可以实现更复杂的调度规则。

应用场景

  1. 定时备份: 定期备份数据库或文件系统。
  2. 数据同步: 定期从外部系统同步数据。
  3. 报表生成: 定时生成和发送报表。
  4. 任务调度: 执行周期性任务,如清理日志、发送通知等。

示例代码

以下是一个简单的示例,展示如何在 Spring Boot 中使用 Quartz 并发执行多个作业。

1. 添加依赖

pom.xml 中添加 Quartz 和 Spring Boot 相关依赖:

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

2. 定义 Job

创建一个简单的 Job 类:

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

public class SampleJob implements Job {
    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        System.out.println("Executing job: " + context.getJobDetail().getKey().getName());
    }
}

3. 配置 Scheduler

在 Spring Boot 应用程序中配置 Quartz:

代码语言:txt
复制
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;

@Configuration
public class QuartzConfig {

    @Bean
    public SchedulerFactoryBean schedulerFactoryBean() {
        SchedulerFactoryBean factory = new SchedulerFactoryBean();
        return factory;
    }
}

4. 创建 Trigger 和 JobDetail

在应用程序启动时创建多个 Trigger 和 JobDetail:

代码语言:txt
复制
import org.quartz.*;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;

@Component
public class QuartzInitializer implements CommandLineRunner {

    @Override
    public void run(String... args) throws Exception {
        Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();

        for (int i = 0; i < 5; i++) {
            JobDetail job = JobBuilder.newJob(SampleJob.class)
                    .withIdentity("job" + i, "group1")
                    .build();

            Trigger trigger = TriggerBuilder.newTrigger()
                    .withIdentity("trigger" + i, "group1")
                    .startNow()
                    .withSchedule(SimpleScheduleBuilder.simpleSchedule()
                            .withIntervalInSeconds(10)
                            .repeatForever())
                    .build();

            scheduler.scheduleJob(job, trigger);
        }

        scheduler.start();
    }
}

遇到的问题及解决方法

问题:并发执行多个作业时出现资源竞争

原因: 多个作业同时访问和修改共享资源,导致数据不一致或冲突。

解决方法:

  1. 使用锁机制: 在 Job 中使用同步块或分布式锁来保护共享资源。
  2. 数据库事务: 使用数据库事务来确保数据的一致性。
  3. 消息队列: 将任务放入消息队列中,逐个处理,避免并发冲突。

示例代码:使用同步块保护共享资源

代码语言:txt
复制
public class SampleJob implements Job {
    private static final Object lock = new Object();

    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        synchronized (lock) {
            System.out.println("Executing job: " + context.getJobDetail().getKey().getName());
            // 访问和修改共享资源的代码
        }
    }
}

通过以上配置和示例代码,你可以在 Spring Boot 中使用 Quartz 实现并发执行多个作业,并有效处理并发带来的问题。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Spring Boot(十七): 集成 Quartz

Spring Boot(十七): 集成 Quartz 以前我写过spring自带的定时任务SpringBoot(十):定时任务 https://aodeng.cc/archives/springbootshi...很方便也很简单,掌握cron表达式就行,cron 说明 cron 一共有七位,最后一位是年,Spring Boot 定时方案中只需要设置六位即可: 第一位,表示秒,取值 0 ~ 59 第二位,表示分,...,注,不是第 1 周、第 2 周的意思,另外,1 表示星期天,2 表示星期一 第七位,年份,可以留空,取值 1970 ~ 2099 简单介绍一下Quartz Job 为作业的接口,为任务调度的对象;JobDetail...用来描述 Job 的实现类及其他相关的静态信息;Trigger 做为作业的定时管理工具,一个 Trigger 只能对应一个作业实例,而一个作业实例可对应多个触发器;Scheduler 做为定时任务容器...,是 Quartz 最上层的东西,它提携了所有触发器和作业,使它们协调工作,每个 Scheduler 都存有 JobDetail 和 Trigger 的注册,一个 Scheduler 中可以注册多个 JobDetail

58030
  • SparkSql中多个Stage的并发执行

    写一篇水水的技术文,总结一下sparksql中不同stage的并行执行相关,也是来自于一位群友的提问: 我们群里有很多技术很棒并且很热心的大佬,哈哈~ Hive中Job并发执行 hive中,同一sql...里,如果涉及到多个job,默认情况下,每个job是顺序执行的。...可以通过设置参数 set hive.exec.parallel=true,实现job并发执行,该参数默认可以并发执行的job数为8,相关参数如下: set hive.exec.parallel=true...Spark中多个Stage的并发执行 先给结论: 没有相互依赖关系的Stage是可以并行执行的,比如union all 两侧的sql 存在依赖的Stage必须在依赖的Stage执行完成后才能执行下一个Stage...,如果有多个根节点,都会通过submitMissingTasks 提交上去运行。

    1.6K10

    Spring Boot的并发编程

    使用Spring Boot构建服务时,我们必须处理并发!...通常有这样的误解:由于使用Servlet,而Servlet背后是一个线程池支持,线程池会为每个请求分配的新线程,请求之间不存在冲突,因此无需考虑并发性,本文提供一些关于处理Spring Boot中多线程处理的实用建议...Spring Boot并发基础知识 在考虑Spring Boot应用程序中的并发性时,值得考虑的关键因素有: 最大线程数 - 这是为处理对应用程序的请求而分配的最大线程数 共享外部资源 - 调用外部共享资源...建议使用Spring Boot2的WebFlux。 在Spring Boot中进行异步调用 如何在Spring Boot中启用异步方法调用?...如果你要依赖它 - 学习正确的并发性编程。 总结 Spring中的并发和多线程是重要的主题。在本文中,主要强调在编写Spring Boot应用程序时需要注意的关键地方。

    4.4K60

    Spring Boot Aop 执行顺序

    概述在 spring boot 项目中,使用 aop 增强,不仅可以很优雅地扩展功能,还可以让一写多用,避免写重复代码,例如:记录接口耗时,记录接口日志,接口权限,等等。...然而,当我们在一个接口中使用多个 aop,时,就需要注意他们的执行顺序了。那么,它们的执行顺序是怎样的呢?如果不把这个问题搞明白,那我们的程序就不可控,这是不允许的,这就是我们今天要讨论的问题。2....多个 AOP3.1 分析先提一个疑问:多个AOP注解,执行顺序是怎么样的呢?如何设置执行顺序呢?...比如,APP 请求我们的 API 接口,在请求到达 API 接口之前,可以先执行 AOP1,在执行 AOP2,并且顺序不能变,如下图:我们再拆解一下实际内部执行逻辑。...好了,今天的分享就到这里了,源码:demo-spring-boot-aop。

    21100

    搭建单体SpringBoot项目 集成定时器Quartz

    -- quartz --> org.springframework.boot spring-boot-starter-quartz...并发控制(DisallowConcurrentExecution注解) ​ Quartz定时任务默认都是并发执行的,不会等待上一次任务执行完毕,只要间隔时间到就会执行, 如果定时任执行太长,会长时间占用资源...在Spring中这时需要设置concurrent的值为false, 禁止并发执行。 ​...的注释 @DisallowConcurrentExecution 禁止并发执行多个相同定义的JobDetail, 这个注解是加在Job类上的, 但意思并不是不能同时执行多个Job, 而是不能并发执行同一个...Job上定义了很多个JobDetail, 如sayHelloToJoeJobDetail, sayHelloToMikeJobDetail, 那么当scheduler启动时, 不会并发执行多个sayHelloToJoeJobDetail

    48940

    spring-boot-2.0.3之quartz集成,不是你想的那样哦!

    ,因此任务是并发执行的,相互之间不会受到干扰。...Spring Scheduler     spring对任务调度的实现支持,可以指定任务的执行时间,但对任务队列和线程池的管控较弱;一般集成于项目中,小任务很方便。   ...总结   Quartz作为一个开源的作业调度框架,提供了巨大的灵活性而不牺牲简单性。我们能够用它来为执行一个作业而创建简单的或复杂的调度。...quartz提供的功能,springboot默认会帮我们配置好quartz;当然我们也可以自定义配置来实现quartz的定制; 参考 几种任务调度的Java实现方法与比较 小柒2012 / spring-boot-quartz...boot-features-quartz 作业调度系统—Quartz 记一次Quartz重复调度(任务重复执行)的问题排查 Quartz FAQ

    1.2K31
    领券