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

java:简单入门定时任务的几种方式Timer、Quartz、Spring Task

背景

后端的定时任务在许多应用中都扮演着重要的角色,它们可用于处理重复性任务、执行定期操作或处理需要定时触发的任务。以下是一些使用场景的示例:

  • 数据同步:在分布式系统中,不同系统之间经常需要进行数据同步。例如,一个系统可能需要定期从另一个系统获取最新数据,或者将数据推送到另一个系统。定时任务可以用于定期执行这些数据同步操作。
  • 报表生成:对于需要生成报表或报告的企业应用,可以使用定时任务来定期收集数据、生成报告并发送给相关人员。这样,报表或报告可以在特定时间(如每天、每周或每月)自动生成并发送给用户。
  • 定时任务调度:对于需要定期执行某些任务的应用,如定期清理临时文件、备份数据、发送通知等,可以使用定时任务来实现。这样,任务可以在指定的时间自动执行,无需人工干预。
  • 日志分析:许多系统会生成大量的日志数据。使用定时任务可以定期对这些日志进行分析,以便及时发现潜在的问题或异常情况。
  • 监控和警报:定时任务可以用于监控系统的性能和状态,并在发现问题时发送警报。例如,可以定期检查服务器的CPU使用率、内存消耗等指标,并在指标超过阈值时发送警报。
  • 自动化流程:在业务流程自动化或工作流管理中,定时任务可以用于触发某些流程步骤或操作。例如,可以在特定时间自动将任务分配给员工、发送审批请求或触发其他流程操作。
  • 数据爬取:对于需要定期从互联网获取数据的应用,如新闻聚合、价格监控、竞争情报等,可以使用定时任务来执行数据爬取操作。这样,应用可以在指定时间自动获取最新数据,并进行处理和分析。

在Java中,你可以使用各种库和框架来创建和管理定时任务,如Quartz、Spring的@Scheduled注解、Timer等。选择适合你项目需求的工具和方法,并确保正确配置和管理定时任务,以确保它们在正确的时机执行并达到预期的效果。

分类

触发时机

  • 每隔指定时间则触发一次
  • 每到指定时间则触发一次

并非每种任务都可以使用这两种触发器,如java.util.TimerTask任务就只能使用第一种。而 Quartz 和 spring task 可以支持这两种触发条件。

每隔指定时间则触发一次,在 Quartz 中对应的触发器为:org.springframework.scheduling.quartz.SimpleTriggerBean
每到指定时间则触发一次,在 Quartz 中对应的调度器为: org.springframework.scheduling.quartz.CronTriggerBean

java.util.Timer类

Java自带的java.util.Timer类,这个类允许调度一个java.util.TimerTask任务。使用这种方式可以让程序按照某一个频度执行,但不能在指定时间运行。一般用的较少。

import java.util.Timer;  
import java.util.TimerTask;  public class Main {  public static void main(String[] args) {  Timer timer = new Timer(); // 创建一个新的 Timer 实例  TimerTask task = new TimerTask() { // 创建一个新的 TimerTask 实例  @Override  public void run() {  System.out.println("任务正在执行...");  }  };  // 安排任务每秒钟执行一次,总共执行10次  timer.scheduleAtFixedRate(task, 0, 1000);  }  
}

Quartz

使用 Quartz,这是一个功能比较强大的的调度器,可以让程序在指定时间执行,也可以按照某一个频度执行,配置起来稍显复杂。

1、添加Quartz依赖
在你的项目中添加Quartz依赖。如果你使用Maven,请在pom.xml文件中添加以下依赖:

<dependency>  <groupId>org.quartz-scheduler</groupId>  <artifactId>quartz</artifactId>  <version>2.3.2</version> <!-- 请检查是否有更新的版本 -->  
</dependency>

2、创建Job类
创建一个简单的Job类,它将执行你想要定期执行的任务。在这个例子中,我们将创建一个简单的Job,只是打印一条消息。

public class MyJob implements Job {  public void execute(JobExecutionContext context) throws JobExecutionException {  System.out.println("定时任务执行中...");  }  
}

3、创建Scheduler和任务计划
创建一个Scheduler实例,并设置任务计划。在这个例子中,我们将创建一个简单的定时任务,每5秒执行一次。

import org.quartz.*;  
import org.quartz.impl.StdSchedulerFactory;  public class QuartzSchedulerExample {  public static void main(String[] args) {  try {  Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();  JobDetail job = JobBuilder.newJob(MyJob.class)  .withIdentity("myJob", "group1")  .build();  Trigger trigger = TriggerBuilder.newTrigger()  .withIdentity("myTrigger", "group1")  .startNow()  .withSchedule(SimpleScheduleBuilder.simpleSchedule()  .withIntervalInSeconds(5) // 每5秒执行一次任务  .repeatForever()) // 无限循环执行任务  .build();  scheduler.scheduleJob(job, trigger);  scheduler.start(); // 启动调度器  } catch (SchedulerException e) {  e.printStackTrace();  }  }  
}

5、运行示例代码
运行QuartzSchedulerExample类的main方法。你应该看到控制台输出"定时任务执行中…",每5秒一次。

Spring的@Scheduled注解

Spring3.0 以后自带的 task,可以将它看成一个轻量级的 Quartz,而且使用起来比 Quartz 简单许多。

1、首先,在你的Spring Boot项目的pom.xml文件中,添加Spring Scheduled的依赖:

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

2、创建一个定时任务类,例如MyScheduledTask.java:

import org.springframework.scheduling.annotation.Scheduled;  
import org.springframework.stereotype.Component;  @Component  
public class MyScheduledTask {  @Scheduled(fixedRate = 5000) // 每5秒执行一次  public void execute() {  System.out.println("定时任务执行中...");  }  
}

3、在主应用类或配置类上添加@EnableScheduling注解,以启用定时任务支持:

import org.springframework.boot.SpringApplication;  
import org.springframework.boot.autoconfigure.SpringBootApplication;  
import org.springframework.scheduling.annotation.EnableScheduling;  @SpringBootApplication  
@EnableScheduling  
public class MySpringBootApplication {  public static void main(String[] args) {  SpringApplication.run(MySpringBootApplication.class, args);  }  
}

运行你的Spring Boot应用。现在,你应该每5秒在控制台看到"定时任务执行中…"的输出。

相关文章:

java:简单入门定时任务的几种方式Timer、Quartz、Spring Task

背景 后端的定时任务在许多应用中都扮演着重要的角色&#xff0c;它们可用于处理重复性任务、执行定期操作或处理需要定时触发的任务。以下是一些使用场景的示例&#xff1a; 数据同步&#xff1a;在分布式系统中&#xff0c;不同系统之间经常需要进行数据同步。例如&#xf…...

木子-前端-方法标签属性小记(普通jsp/html篇)2023~2024

目录 1、如何在前端页面将base转成存进input的图片格式 2、通过前端页面判断当前使用方式PC端还是手机端的极简易方法 1、如何在前端页面将base转成存进input的图片格式 不是直接存进input里&#xff0c;只是将文件转成对应的格式。 data.picPath是base64编码&#xff0c;我…...

音视频项目—基于FFmpeg和SDL的音视频播放器解析(十七)

介绍 在本系列&#xff0c;我打算花大篇幅讲解我的 gitee 项目音视频播放器&#xff0c;在这个项目&#xff0c;您可以学到音视频解封装&#xff0c;解码&#xff0c;SDL渲染相关的知识。您对源代码感兴趣的话&#xff0c;请查看基于FFmpeg和SDL的音视频播放器 如果您不理解本…...

使用netty实现WebSocket协议通信

服务器与浏览器之间实现通信&#xff0c;一般都是由浏览器发起http请求&#xff0c;服务端对http请求进行响应&#xff0c;要实现服务端主动向浏览器推送数据&#xff0c;一般采用的方案都是websocket主动推送&#xff0c;或者前端实现轮询方式拉取数据&#xff0c;轮询方式多少…...

uniapp开发小程序,包过大解决方案

1、首先和大家说一下 微信小程序 主包限制不能超过2M 分包一共不能超过8M 然后具体解决优化步骤如下&#xff0c; 将主包进行分包 在pages.json 下subPackages里面进行配置分包 分包配置完 配置过的文件都需要进行修改对应的路径 2 、 在运行的时候 一定要勾选 压缩代码 有…...

Go语言中string与byte转换

简介 string与byte的转换是最常见的一种&#xff0c;通常我们会使用强转方式&#xff0c;但其实还有另一种更加高效的方式&#xff0c;本文会演示两种转换方式。 普通转换 func main() {fmt.Println([]byte("abcd"))fmt.Println(string([]byte{1, 2, 3})) }输出 […...

机器学习8:在病马数据集上进行算法比较(ROC曲线与AUC)

ROC曲线与AUC。使用不同的迭代次数&#xff08;基模型数量&#xff09;进行 Adaboost 模型训练&#xff0c;并记录每个模型的真阳性率和假阳性率&#xff0c;并绘制每个模型对应的 ROC 曲线&#xff0c;比较模型性能&#xff0c;输出 AUC 值最高的模型的迭代次数和 ROC 曲线。 …...

70. 爬楼梯 --力扣 --JAVA

题目 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 解题思路 通过对爬楼梯进行分解&#xff0c;爬到当前台阶的方式分为两种&#xff0c;即由上一个台阶通过爬1和上两个台阶爬2&#xff0c;同公…...

体感互动游戏VR游戏AR体感游戏软件开发

随着科技的不断发展&#xff0c;体感互动游戏正逐渐成为游戏行业的一个重要趋势。这类游戏通过利用传感器、摄像头和运动控制器等技术&#xff0c;使玩家能够通过身体动作与游戏进行实时互动&#xff0c;极大地提升了娱乐体验。 1. 游戏设计与互动元素 体感互动游戏的核心在于…...

计算3个点的6种分布在平面上的占比

假设平面的尺寸是6*6&#xff0c;用11的方式构造2&#xff0c;在用21的方式构造3 2 2 2 1 2 2 2 2 2 1 2 2 2 2 2 1 2 2 3 3 3 x 3 3 2 2 2 1 2 2 2 2 2 1 2 2 在平面上有一个点x&#xff0c;11的操作吧平面分成了3部分2a1&#xff0c;2a…...

【香橙派】实战记录1——简介及烧录 Linux 镜像

文章目录 一、简介1、参数2、结构3、其他配件4、下载资料 二、基于 Windows PC 将 Linux 镜像烧写到 TF 卡的方法1、使用 balenaEtcher 烧录 Linux 镜像的方法2、效果 一、简介 Orange Pi Zero 3 香橙派是一款开源的单板卡片电脑&#xff0c; 新一代的arm64开发板&#xff0c;…...

redis之高可用

&#xff08;一&#xff09;redis之高可用 1、在集群当中有一个非常重要的指标&#xff0c;提供正常服务的时间的百分比&#xff08;365天&#xff09;99.9% 2、redis的高可用的含义更加广泛&#xff0c;正常服务是指标之一&#xff0c;数据容量的扩展、数据的安全性 3、在r…...

使用 Core Tools 在本地开发 Azure Functions

学习模块 使用 Core Tools 在本地创建和运行 Azure Functions - Training | Microsoft Learn 文档 使用 Core Tools 在本地开发 Azure Functions | Microsoft Learn GitHub - Azure/azure-functions-core-tools: Command line tools for Azure Functions 其它 安装适用于 A…...

Java零基础——Spring篇

1.Spring框架的介绍 1.1 传统的项目的架构 在传统的项目中&#xff0c;一般遵循MVC开发模型。 (1) view层与用户进行交互&#xff0c;显示数据或者将数据传输给view层。 (2) 在controller层创建service层对象&#xff0c;调用service层中业务方法。 (3) 在service层创建dao…...

jenkins清理缓存命令

def jobName "yi-cloud-operation" //删除的项目名称 def maxNumber 300 // 保留的最小编号&#xff0c;意味着小于该编号的构建都将被删除 Jenkins.instance.getItemByFullName(jobName).builds.findAll { it.number < maxNumber }.each { it.delet…...

什么是深度学习

一、深度学习的发展历程 1.1 Turing Testing (图灵测试) 图灵测试是人工智能是否真正能够成功的一个标准&#xff0c;“计算机科学之父”、“人工智能之父”英国数学家图灵在1950年的论文《机器会思考吗》中提出了图灵测试的概念。即把一个人和一台计算机分别放在两个隔离的房…...

数字IC基础:有符号数和无符号数加、减法的Verilog设计

相关阅读 数字IC基础https://blog.csdn.net/weixin_45791458/category_12365795.html?spm1001.2014.3001.5482 本文是对数字IC基础&#xff1a;有符号数和无符号数的加减运算一文中的谈到的有符号数加减法的算法进行Verilog实现&#xff0c;有关算法细节请阅读原文&#xff0…...

2023年11月25日(星期六)骑行三家村

2023年11月25日 (星期六) 骑行三家村(赏红杉林&#xff09;&#xff0c;早8:30到9:00&#xff0c; 大观公园门囗集合&#xff0c;9:30准时出发 【因迟到者&#xff0c;骑行速度快者&#xff0c;可自行追赶偶遇。】 偶遇地点:大观公园门口集合 &#xff0c;家住东&#xff0c;南…...

.skip() 和 .only() 的使用

.skip() 和 .only() 的使用 说明 在做自动化测试中&#xff0c;跳过执行某些测试用例&#xff0c;或只运行某些指定的测试用例&#xff0c;这种情况是很常见的Cypress中也提供了这种功能 如何跳过测试用例 通过describe.skip() 或者 context.skip() 来跳过不需要执行的测试…...

如何证明特征值的几何重数不超过代数重数

设 λ 0 \lambda_0 λ0​ 是 A A A 的特征值&#xff0c;则 λ 0 \lambda_0 λ0​ 的代数重数 ≥ \geq ≥ 几何重数 证明 假设 A A A 的特征值 λ 0 \lambda_0 λ0​ 对应的特征向量有 q 维&#xff0c;记为 α 1 , . . . , α q \alpha_1, ... , \alpha_q α1​,...,…...

Obsidian Tasks 终极指南:6个优先级符号让任务管理效率提升300%

Obsidian Tasks 终极指南&#xff1a;6个优先级符号让任务管理效率提升300% 【免费下载链接】obsidian-tasks Task management for the Obsidian knowledge base. 项目地址: https://gitcode.com/gh_mirrors/ob/obsidian-tasks Obsidian Tasks 是 Obsidian 知识库中功能…...

麒麟V10 SP3 2303桌面版防火墙白名单配置全攻略:从图形化到命令行,再到开机自启的完整避坑指南

麒麟V10 SP3防火墙白名单配置实战&#xff1a;从入门到持久化 在国产操作系统麒麟V10上部署服务时&#xff0c;防火墙配置往往是第一个拦路虎。许多开发者都有这样的经历&#xff1a;明明在图形界面添加了规则&#xff0c;服务却依然无法访问&#xff1b;或者命令行配置看似成功…...

零基础AI写作助手:oobabooga文本生成平台一键安装指南

零基础AI写作助手&#xff1a;oobabooga文本生成平台一键安装指南 【免费下载链接】one-click-installers Simplified installers for oobabooga/text-generation-webui. 项目地址: https://gitcode.com/gh_mirrors/on/one-click-installers 还在为复杂的AI环境配置而烦…...

2026数据科学学习路线图:从Python基础到深度学习部署实战

1. 数据科学学习路线图&#xff1a;一份面向2026年的实战指南 如果你正站在数据科学的大门前&#xff0c;看着里面琳琅满目的技术栈和层出不穷的新名词感到迷茫&#xff0c;不知道从哪里开始&#xff0c;也不知道该往哪里走&#xff0c;那么你来对地方了。这份路线图不是一份简…...

别再复制粘贴了!手把手教你用C语言实现一个通用的CRC-8校验函数(附三种优化方案)

从原理到实战&#xff1a;C语言实现高效CRC-8校验的三种工程化方案 在嵌入式开发中&#xff0c;数据校验是确保通信可靠性的基石。当开发者面对I2C、SPI或自定义串口协议时&#xff0c;CRC-8校验因其简单高效的特点成为首选方案。但大多数开发者止步于复制网络代码的阶段&#…...

基于Compose Multiplatform的跨平台AI对话客户端DeepCo开发实践

1. 项目概述&#xff1a;一个跨平台的AI对话客户端最近在折腾AI应用开发&#xff0c;发现市面上的AI对话工具要么是Web端&#xff0c;要么就是平台绑定太死。作为一个喜欢把工具握在自己手里的开发者&#xff0c;我决定自己动手&#xff0c;用Compose Multiplatform技术栈搞一个…...

基于Next.js构建极简ChatGPT Web客户端:从部署到二次开发全指南

1. 项目概述&#xff1a;一个极简但功能完整的ChatGPT Web界面如果你厌倦了官方ChatGPT网页版偶尔的卡顿、复杂的界面&#xff0c;或者想拥有一个完全可控、能部署在自己服务器上的AI对话工具&#xff0c;那么chatgpt-minimal这个项目绝对值得你花时间研究。它是一个基于Next.j…...

Cockpit Tools:一站式管理多平台AI编程助手账号与配额

1. 项目概述&#xff1a;一个AI开发者的“驾驶舱”如果你和我一样&#xff0c;日常开发重度依赖 GitHub Copilot、Cursor、Antigravity 这些 AI 编程助手&#xff0c;那你肯定也遇到过类似的烦恼&#xff1a;手头有好几个账号&#xff0c;有的是个人订阅&#xff0c;有的是团队…...

5分钟免费解锁iPhone激活锁:applera1n终极完整指南

5分钟免费解锁iPhone激活锁&#xff1a;applera1n终极完整指南 【免费下载链接】applera1n icloud bypass for ios 15-16 项目地址: https://gitcode.com/gh_mirrors/ap/applera1n 当您面对二手iPhone上的"此iPhone已关联到所有者"激活锁界面时&#xff0c;是…...

【AI-03】什么是LLM模型

文章目录一句话核心解释一个简单的比喻&#xff1a;智能输入法LLM是如何工作的&#xff1f;&#xff08;非技术简化版&#xff09;LLM的关键特性我们日常接触到的LLM例子LLM能做什么&#xff1f;LLM的局限性一句话核心解释 LLM 是 Large Language Model 的缩写&#xff0c;中文…...