Spring Boot如何集成Quartz实现定时任务

在项目开发中,经常需要定时任务来后台处理业务,比如定时生成数据报表、生成对账单、数据监控等。Spring Boot 中有两种方案可以选择,第一种是 Spring

大家好,今天给各位分享Spring Boot如何集成Quartz实现定时任务的一些知识,其中也会对进行解释,文章篇幅可能偏长,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在就马上开始吧!

一、 Quartz 介绍

Quartz是一个非常流行的开源任务调度管理器。它采用Java开发,具有使用灵活、配置简单的特点。能够实现复杂应用场景下的任务调度管理。

Quartz中有几个非常重要的概念:Job(任务)、JobDetail(任务信息)、Trigger(触发器)和Scheduler(调度器)。只有熟悉了这些概念,才能理解如何使用Quartz。

(1)Job:它是一个只有一个execute方法的接口。在实现接口的execute方法中,编写需要定时执行的函数;作业运行时信息存储在JobDataMap实例中。

(2)JobDetail:Quartz每次调度Job时都会创建一个Job实例。主要记录Job任务相关的基本信息(如Job名称、描述、关联监听器等),以便运行时通过newInstance()的反射机制实例化对应的Job任务。

(3)Trigger:是触发器类,描述了触发Job执行的触发规则。主要有两个类:SimpleTrigger 和CronTrigger。 SimpleTrigger主要用于固定时间间隔执行任务,而CronTrigger则可以通过Cron表达式定义各种复杂时间规则的调度计划,比如设置每周一到周五的15:00到16:00执行任务等。

(4)调度器:相当于一个独立运行的容器,加载任务和触发器。触发器和JobDetail可以注册到Scheduler中。 Scheduler定义了多种接口方法,允许外部通过组和名称来访问和控制容器中的Trigger。和工作详细信息。

四者之间的关系如下图所示:

二、整合Quartz

Spring Boot 2.0提供了spring-boot-starter-quartz组件,它集成了Quartz框架,使得我们在项目中使用Quartz变得非常简单。

1.配置pom.xml

dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-quartz/artifactId/dependency Spring Boot集成quartz非常简单,只需在pom.xml文件中添加quartz依赖即可,无需其他配置。

Spring Boot如何集成Quartz实现定时任务

三、创建简单任务

1、首先定义一个Job,需要继承QuartzJobBean。在示例中,Job定义了一个变量Name,用于在计划执行期间传入它。

公共类SampleJob 扩展QuartzJobBean { 私有字符串名称; public void setName(String name) { this.name=name; } } @Override protected voidexecuteInternal(JobExecutionContext context) throws JobExecutionException { System.out.println(String.format(‘Hello % s!’, this.name)); }}2.然后构建JobDetail,构建时传入name属性的值,构建JobTrigger和scheduleBuilder,最后使用Scheduler启动定时任务。

@Configurationpublic class SampleScheduler { @Bean public JobDetail SampleJobDetail() { return JobBuilder.newJob(SampleJob.class).withIdentity(‘sampleJob’) .usingJobData(‘name’, ‘World’).storeDurively().build(); } } @Bean public Trigger SampleJobTrigger() { SimpleScheduleBuilder ScheduleBuilder=SimpleScheduleBuilder.simpleSchedule() .withIntervalInSeconds(2).repeatForever(); return TriggerBuilder.newTrigger().forJob(sampleJobDetail()).withIdentity(‘sampleTrigger’).withSchedule(scheduleBuilder).build(); }}启动项目后每两秒输出一次:

你好世界!你好世界!你好世界!JobBuilder构造函数只能通过JobBuilder的静态方法newJob()生成一个JobBuilder实例。

withIdentity方法可以传入两个参数withIdentity(String name,String group)来定义TriggerKey,否则可以不设置。和前面的例子一样,会自动生成一个唯一的TriggerKey来区分不同的Trigger。

上面是创建了一个简单的任务,任务以固定的时间间隔执行。

四、创建cron定时任务

CronSchedule可以设置更灵活的用法。定时设置可以参考上面的cron表达式。

1.首先定义两个job

public class ScheduledJob Implements Job {@Overridepublic voidexecute(JobExecutionContext context) throws JobExecutionException{ System.out.println(‘schedule job1 is running.’);}} 2.构建jobDetail和CronTrigger,最后使用scheduler关联jobDetail和CronTrigger 。 ScheduleJob1 设置为每6 秒执行一次。

私有无效scheduler调度程序)抛出SchedulerException{JobDetail jobDetail=JobBuilder.newJob(ScheduledJob.class).withIdentity(’job1’,’group1’).build(); CronScheduleBuilder ScheduleBuilder=CronScheduleBuilder.cronSchedule(’0/6 * * * * ?’);CronTrigger cronTrigger=TriggerBuilder.newTrigger().withIdentity(‘trigger1′,’group1’).withSchedule(scheduleBuilder).build();scheduler.scheduleJob(jobDetail,cronTrigger);}CronScheduleBuilder.cronSchedule(‘ 0/6 * * * * ?’),根据cron表达式设置定时任务的执行周期。

Spring Boot如何集成Quartz实现定时任务

3、触发定时任务

公共无效scheduleJobs()抛出SchedulerException { Scheduler调度程序=SchedulerFactoryBean.getScheduler();调度作业1(调度程序); ScheduleJob2(调度程序);}

最后

以上,Spring Boot与Quartz集成,实现定时任务。还是比较简单的。另一个重要的点是cron 表达式。这个稍后会单独介绍。

推荐阅读:

Spring Boot入门系列(八)整合定时任务,一秒完成定时任务

Spring Boot入门系列(十五)Spring Boot开发环境热部署配置

Spring Boot使用JdbcTemplate操作数据库并配置多个数据源

Maven快速入门(二)手动创建maven项目hellomaven

Maven快速入门(一)Maven简介及环境搭建

用户评论

Spring Boot如何集成Quartz实现定时任务
疯人疯语疯人愿

这篇文章讲得真不错!我一直在找 Spring Boot 整合 Quartz 的方法,终于找到解决办法了!感觉代码逻辑清晰易懂,配合图解讲解,更容易理解。以后我的定时任务可以实现更自动化的调度了!

    有17位网友表示赞同!

Spring Boot如何集成Quartz实现定时任务
慑人的傲气

说的太专业了,我不是很懂技术细节,能不能用更通俗的语言解释一下?或者增加一些实例来帮助理解?这样对入门小白更有帮助吧。

    有13位网友表示赞同!

Spring Boot如何集成Quartz实现定时任务
夏日倾情

学习Quartz确实很有难度,不过这个 Spring Boot 整合方法看起来还是挺方便的。我之前尝试过手动配置,非常复杂!这篇博客提供的方案简洁明了,以后可以试试啊!

    有18位网友表示赞同!

Spring Boot如何集成Quartz实现定时任务
繁华若梦

关于任务执行失败的处理逻辑,文中没有提到,这是个需要重点关注的部分吧?遇到任务执行失败应该如何进行告警或重试?

    有6位网友表示赞同!

Spring Boot如何集成Quartz实现定时任务
凉凉凉”凉但是人心

很不错的一篇文章,我之前一直是用简单的 ThreadPoolExecutor 来定时执行任务,现在了解到Quartz 更加灵活和强大,能更精准地控制任务调度频率,这个是我之前没有考虑到的!

    有6位网友表示赞同!

Spring Boot如何集成Quartz实现定时任务
荒野情趣

这个整合方法确实可以减少配置的复杂度,但是要注意的是,在不同的系统环境下可能需要进行一些调整配置吧?这篇文章应该再多解释一些细节,防止大家使用过程中遇到问题。

    有16位网友表示赞同!

Spring Boot如何集成Quartz实现定时任务
刺心爱人i

总而言之,Spring Boot 整合Quartz 是个很棒的选择!它提供了更灵活、更高效的定时任务执行方式,让我能够更加轻松地管理和维护系统运行逻辑。

    有18位网友表示赞同!

Spring Boot如何集成Quartz实现定时任务
心安i

我感觉文章还是偏向于技术细节描述了,如果能从实际应用场景出发,结合一些具体的案例来讲解Spring Boot 整合 Quartz 的优势在哪儿,会更加吸引读者!

    有5位网友表示赞同!

Spring Boot如何集成Quartz实现定时任务
赋流云

使用 Spring Boot 整合 Quartz 可以实现更复杂的定时任务调度需求,比如根据不同的条件执行不同的任务,以及对任务的日志记录和错误处理等等。感觉这个框架非常强大!

    有14位网友表示赞同!

Spring Boot如何集成Quartz实现定时任务
封心锁爱

我一直在思考如何在 Spring Boot 项目中进行定时任务管理,看来 Spring Boot 整合 Quartz 是个不错的解决方案!不过需要进一步学习一下Quartz 的配置和使用方式才能更好地运用到项目开发中。

    有16位网友表示赞同!

Spring Boot如何集成Quartz实现定时任务
仅有的余温

对于初学者来说,可能对Quartz的了解还比较少,这篇博客可以作为入门指南,帮助大家快速理解如何将Spring Boot 和Quartz整合起来。

    有11位网友表示赞同!

Spring Boot如何集成Quartz实现定时任务
男神大妈

关于定时任务的并发控制以及任务之间的依赖关系,文中的解释不够详细,希望能有更多针对性地讲解!

    有10位网友表示赞同!

Spring Boot如何集成Quartz实现定时任务
烬陌袅

我一直在寻找一种轻量级、灵活的 Spring Boot 定时任务解决方案,看来 Quartz 可以满足我的需求!需要深入学习一下 Quartz 的各个配置选项和功能的使用。

    有16位网友表示赞同!

Spring Boot如何集成Quartz实现定时任务
剑已封鞘

这段代码看着好复杂啊,希望能提供更加直观的代码示例,以及针对不同场景的实例化方法讲解,这样更容易理解和应用吧!

    有15位网友表示赞同!

Spring Boot如何集成Quartz实现定时任务
孤单*无名指

Spring Boot 整合Quartz确实可以提升系统开发效率,但需要注意的是,过多的依赖和复杂的调度逻辑可能会带来难以维护的风险。 需要权衡利弊,合理规划任务执行策略。

    有16位网友表示赞同!

Spring Boot如何集成Quartz实现定时任务
青衫负雪

这篇博客对我来说非常有帮助,帮我解决了 Spring Boot 项目中定时任务调度的问题!感谢作者分享!

    有7位网友表示赞同!

Spring Boot如何集成Quartz实现定时任务
伪心

文章讲解了Spring Boot 整合Quartz 的基本原理和步骤,但对于较为复杂的任务调度情况,可以再详细一些。例如如何实现周期任务的动态调整、任务分组管理等。

    有5位网友表示赞同!

Spring Boot如何集成Quartz实现定时任务
々爱被冰凝固ゝ

Spring Boot 整合Quartz 的优势比较明显,能让我们更方便地实现灵活的定时任务调度,并且可以更好地控制任务执行频率和日志记录。

    有7位网友表示赞同!

Spring Boot如何集成Quartz实现定时任务
。婞褔vīp

学习了这个整合方法后,我的项目开发效率得到了很好的提升!感谢作者分享!

    有10位网友表示赞同!

原创文章,作者:小su,如若转载,请注明出处:https://www.sudun.com/ask/118838.html

(0)
小su的头像小su
上一篇 2024年9月1日 上午11:17
下一篇 2024年9月1日 上午11:19

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注