当前位置: 首页 > news >正文

Spring Boot中实现定时任务的主要方式

文章目录

  • 在Spring Boot中实现定时任务,主要有以下几种方式:
    • 1. 使用@Scheduled注解
    • 2. 使用Quartz调度器
    • 使用Quartz调度器(更好的做法)
    • 3. 使用TaskExecutor和ScheduledExecutorService
    • 4.总结

在Spring Boot中实现定时任务,主要有以下几种方式:

1. 使用@Scheduled注解

这是Spring Boot中最为简便的一种方式,只需在方法上添加@Scheduled注解,并指定任务的执行计划(如Cron表达式或固定延迟/间隔)。此外,还需要在Spring Boot的主类或配置类上添加@EnableScheduling注解来启用定时任务支持。

import com.fs.service.UserService;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;import javax.annotation.Resource;/*** @author: jpeng* @date: 2024/9/11 11:00* @description: Task定时任务*/
@Component
public class MyTask {@Resourceprivate UserService userService;//定义需要执行的任务,每隔多少时间执行一次@Scheduled(cron = "*/2 * * * * ?")public void taskone(){System.out.println("task info...");//例子//实际中我们可以调用service层的方法进行操作}
}
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;@SpringBootApplication
@MapperScan("com.fs.mapper")
//开启task定时任务功能
@EnableScheduling
public class MybatisPlusApplication {public static void main(String[] args) {SpringApplication.run(MybatisPlusApplication.class, args);}}

2. 使用Quartz调度器

Quartz是一个功能丰富的开源作业调度库,它提供了比Spring的@Scheduled注解更为复杂的调度选项,如作业持久化、集群支持和事务性作业。

在Spring Boot中集成Quartz,你需要添加Quartz的依赖,并配置JobDetail、Trigger和Scheduler bean。

<!-- 在pom.xml中添加Quartz依赖 -->  
<dependency>  <groupId>org.quartz-scheduler</groupId>  <artifactId>quartz</artifactId>  <version>你的Quartz版本</version>  
</dependency>

然后,定义作业类、配置Quartz调度器,并通过Java配置或XML配置来注册JobDetail和Trigger。

使用Quartz调度器(更好的做法)

更好的做法(定义作业类,只定义JobDetail和Trigger的Bean)
在这种的情况下,我们只是定义了JobDetail和Trigger的Bean,并且没有显式地创建和启动Scheduler,那么这通常是可以的,并且通常是更好的做法,特别是当我们使用Spring Boot的spring-boot-starter-quartz时。

spring-boot-starter-quartz会自动为您配置并启动Scheduler,它会查找您定义的JobDetail和Trigger的Bean,并将它们注册到Scheduler中。这样,您就不需要自己手动管理Scheduler的生命周期了。

<!--quartz定时任务--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-quartz</artifactId></dependency>
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;/*** @author: jpeng* @date: 2024/9/11 10:31* @description: spring管理job* 1、定义类继承QuartzJobBean* 2、重写executeInternal来实现定时任务功能* 3、通过配置类来执行job触发器和调度器管理*/
public class MyQuarzJob extends QuartzJobBean {@Overrideprotected void executeInternal(JobExecutionContext context) throws JobExecutionException {System.out.println("quartz task run...");}
}
import com.fs.job.MyQuarzJob;
import org.quartz.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** @author: jpeng* @date: 2024/9/11 10:33* @description: Quartz配置类*/
@Configuration
public class QuartzConfig {@Beanpublic JobDetail detail(){//绑定具体的工具Jobreturn JobBuilder.newJob(MyQuarzJob.class).storeDurably().build();}@Beanpublic Trigger jobTrigger(){//指定了调度的规则CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule("*/2 * * * * ? *");//通过触发器绑定工作明细和指定触发器调度规则return TriggerBuilder.newTrigger().forJob(detail()).withSchedule(cronScheduleBuilder).build();}
}

3. 使用TaskExecutor和ScheduledExecutorService

虽然这两种方式并不直接等同于定时任务调度,但它们可以用于在Spring Boot应用中执行异步任务。TaskExecutor是Spring框架中用于执行异步任务的接口,而ScheduledExecutorService是Java并发包中提供的一个接口,用于在给定延迟后运行命令或者定期地执行命令。

@Autowired  
private TaskExecutor taskExecutor;  public void executeAsyncTask() {  taskExecutor.execute(() -> {  // 执行异步任务  });  
}  // 或者使用Java的ScheduledExecutorService  
@Bean  
public ScheduledExecutorService scheduledExecutorService() {  return Executors.newScheduledThreadPool(5);  
}  @Autowired  
private ScheduledExecutorService executorService;  public void scheduleTask() {  executorService.schedule(() -> {  // 执行定时任务  }, 1, TimeUnit.SECONDS);  
}

注意,这些方式通常用于执行异步任务,而不是严格的定时任务调度。对于定时任务调度,推荐使用@Scheduled注解或Quartz。

4.总结

在Spring Boot中,推荐使用@Scheduled注解来实现简单的定时任务调度需求,因为它配置简单且易于使用。对于需要更复杂调度功能的场景,可以考虑使用Quartz。而TaskExecutor和ScheduledExecutorService则更适合于执行异步任务

相关文章:

Spring Boot中实现定时任务的主要方式

文章目录 在Spring Boot中实现定时任务&#xff0c;主要有以下几种方式&#xff1a;1. 使用Scheduled注解2. 使用Quartz调度器使用Quartz调度器(更好的做法)3. 使用TaskExecutor和ScheduledExecutorService4.总结 在Spring Boot中实现定时任务&#xff0c;主要有以下几种方式&a…...

C#使用HttpWebRequest下载文件

public static bool HttpDownloadFile(string downloadUrl, string localPath, log4net.ILog log) { bool bFlagDownloadFile false; //log.Debug("HttpDownloadFile--准备以HTTP的方式下载文件&#xff0c;url:[" downloadUrl &…...

Linux: virtual: qemu-kvm: top cpu usage的组成是否包含guest的使用?

文章目录 问题试验mpstat问题 最近看一个问题,看到一个虚拟机分配的cpu是:3-4,27-28 Cpus_allowed: 0000,18000018 Cpus_allowed_list: 3-4,27-28 使用top看qemu-kvm进程的cpu usage是:13.3%: [root@qrms6-host01 14278]# top -p 14278 top - 01:19:35 up 4 days...

【03】深度学习——神经网络原理 | 多层感知机 | 前向传播和反向传播 | 多层感知机代码实现 | 回归问题、分类问题 | 多分类问题代码实现

深度学习 1.神经网络原理1.1神经元模型1.2神经网络结构1.3隐藏层1.3.1激活函数层1.4输出层1.4.1softmax层1.5损失函数1.6反向传播2.多层感知机2.1线性网络的局限性2.2引入非线性2.3多层感知机(Multi-Layer Perceptron,MLP)2.4激活函数(Activation Function)2.4.1Sigmoid函…...

MySQL行锁的实践

在MySQL中&#xff0c;根据加锁的粒度&#xff0c;可以将数据库的锁细分为表锁、行锁、页锁。其中&#xff0c;表锁(Table Lock)是一种粗粒度的锁&#xff0c;它锁定整个表&#xff0c;阻止其他事务访问表中的任何行&#xff1b;行锁(Row Lock)是一种细粒度的锁&#xff0c;它锁…...

iOS 18 將在 9 月 16 日正式上線

現在有了正式的上線日期了。一如往常的&#xff0c;它會在 iPhone 16 系列正式推出前的 9 月 16 日先行上線。 iOS 18 最受矚目的無疑是它的 Apple Intelligence 功能&#xff0c;不過並非所有的 iPhone 機種都能享用&#xff0c;而是只有去年的 iPhone 15 Pro 和 Pro Max 才能…...

css选择器有几种?选择器的优先级是怎样的?

CSS选择器的主要分类 元素选择器&#xff08;Type Selectors&#xff09;&#xff1a;选择HTML文档中的特定类型的元素。 示例&#xff1a;p { color: red; } 类选择器&#xff08;Class Selectors&#xff09;&#xff1a;选择具有指定类名的元素。 示例&#xff1a;.myClass …...

果蔬识别系统性能优化之路(四)

目录 前情提要剩下问题 问题排查解决方案下一步 前情提要 果蔬识别系统性能优化之路&#xff08;三&#xff09; 剩下问题 同步数据库数据并初始化ivf依然要8,9秒 问题排查 通过断点加时间打印&#xff0c;发生其实初始化ivf的时间很快&#xff0c;慢的是数据在网络间的传…...

kafka之protobuf

Protobuf 的 .proto 文件是一种描述消息结构的定义文件&#xff0c;使用这种文件可以定义数据结构&#xff08;消息&#xff09;&#xff0c;然后生成对应语言的类或代码用于序列化和反序列化数据。生成 .proto 文件涉及到编写 .proto 文件定义&#xff0c;然后通过 protoc 编译…...

BARTBERT

BART和BERT都是基于Transformer架构的预训练语言模型。 模型架构&#xff1a; BERT (Bidirectional Encoder Representations from Transformers) 主要是一个编码器&#xff08;Encoder&#xff09;模型&#xff0c;它使用了Transformer的编码器部分来处理输入的文本&#xff0…...

C++ 11新特性(1)

文章目录 C11新特性之auto和decltype知识点autoauto推导规则什么时候使用auto&#xff1f; decltypedecltype推导规则 auto和decltype的配合使用 C11新特性之左值引用、右值引用、移动语义、完美转发左值、右值纯右值、将亡值纯右值将亡值左值引用、右值引用 移动语义深拷贝、浅…...

彻底理解浅拷贝和深拷贝

目录 浅拷贝实现 深拷贝实现自己手写 浅拷贝 浅拷贝是指创建一个新对象&#xff0c;这个对象具有原对象属性的精确副本 基本数据类型&#xff08;如字符串、数字等&#xff09;&#xff0c;在浅拷贝过程中它们是通过值传递的&#xff0c;而不是引用传递&#xff0c;修改值并不…...

Spring4-IoC2-基于注解管理bean

目录 开启组件扫描 使用注解定义bean Autowired注入 场景一&#xff1a;属性注入 场景二&#xff1a;set注入 场景三&#xff1a;构造方法注入 场景四&#xff1a;形参注入 场景五&#xff1a;只有一个构造函数&#xff0c;无注解 场景六&#xff1a;Autowired和Quali…...

AI基础 L22 Uncertainty over Time I 时间的不确定性

Time and Uncertainty 1 Time and Uncertainty States and Observations • discrete-time models: we view the world as a series of snapshots or time slices • the time interval ∆ between slices, we assume to be the same for every interval • Xt: denotes the se…...

中小型企业网络构建

1 什么是 VLAN&#xff1f; VLAN&#xff0c;指的是虚拟局域网&#xff0c;是一种 2 层技术。可以在交换机上实现广播域的隔离。从而可以减小 数据广播风暴对交换网络的影响&#xff0c;降低了网络管理难度&#xff0c;同时可以实现网络规模的灵活扩展。 2 Trunk 链路与 Acces…...

PXE服务

一.PXE服务的功能介绍 1.无盘启动&#xff1a;PXE允许计算机在没有本地存储设备的情况下启动操作系统。这对于构建无盘工作站非常有用&#xff0c;因为计算机可以直接从网络加载操作系统和其他应用程序1。 2.远程安装操作系统&#xff1a;PXE技术可以用于远程安装操作系统&…...

Docker技术深度解析与实践应用

Docker技术深度解析与实践应用 引言 在现代软件开发与部署的浪潮中&#xff0c;Docker作为一种轻量级的容器化技术&#xff0c;凭借其高效、一致和灵活的特性&#xff0c;逐渐成为云原生应用开发和部署的基石。本文将深入探讨Docker的核心概念、技术原理、实践应用&#xff0…...

链动321模式小程序开发源码

链动31模式概述 链动31模式是一种基于技术的新型商业模式&#xff0c;它通过激励用户分享和推广&#xff0c;实现用户、企业和平台的共赢。该模式通常涉及商品展示、积分系统、分享推广和排行榜等功能&#xff0c;旨在通过用户之间的社交裂变来扩大销售和品牌影响力。如何开发这…...

java开发中间件学习记录(持续更新中~)

1 Redis 2JVM 3 java基础底层 4Mysql 5 spring 6 微服务 7.......(持续更新) One:Redis篇 1:Redis 1.穿透 1.1缓存穿透 1.1.1布隆过滤器 1.2缓存击穿 2&#xff1a;击穿 1.3&#xff1a;缓存雪崩 1.4:双写一致 1.5.持久化&#xff08;RDB,AOF&#xff09; 1.6…...

(批处理)无限弹窗cmd

代码部分 echo off echo 好了&#xff0c;可以退出了 pause>nul echo 再点就要无限弹窗了&#xff01; pause >nul echo 你还点&#xff1f; pause >nul echo 再给你最后一次机会&#xff0c;别点了&#xff0c;再点准备重启 pause >nul echo 点击任意键变身奥特曼…...

Vim 调用外部命令学习笔记

Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能

下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能&#xff0c;包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

CentOS下的分布式内存计算Spark环境部署

一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架&#xff0c;相比 MapReduce 具有以下核心优势&#xff1a; 内存计算&#xff1a;数据可常驻内存&#xff0c;迭代计算性能提升 10-100 倍&#xff08;文档段落&#xff1a;3-79…...

渲染学进阶内容——模型

最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...

04-初识css

一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...

【C语言练习】080. 使用C语言实现简单的数据库操作

080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/

使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题&#xff1a;docker pull 失败 网络不同&#xff0c;需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

【JavaSE】绘图与事件入门学习笔记

-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角&#xff0c;以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向&#xff0c;距离坐标原点x个像素;第二个是y坐标&#xff0c;表示当前位置为垂直方向&#xff0c;距离坐标原点y个像素。 坐标体系-像素 …...

深度学习习题2

1.如果增加神经网络的宽度&#xff0c;精确度会增加到一个特定阈值后&#xff0c;便开始降低。造成这一现象的可能原因是什么&#xff1f; A、即使增加卷积核的数量&#xff0c;只有少部分的核会被用作预测 B、当卷积核数量增加时&#xff0c;神经网络的预测能力会降低 C、当卷…...

JVM 内存结构 详解

内存结构 运行时数据区&#xff1a; Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器&#xff1a; ​ 线程私有&#xff0c;程序控制流的指示器&#xff0c;分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 ​ 每个线程都有一个程序计数…...