在 Spring Boot 中实现定时任务,可以使用以下三种方式

1. 使用 @Scheduled 注解

这是 Spring 提供的简单方式,基于注解实现定时任务

步骤:

  1. 添加依赖
    确保项目中引入了 Spring Boot Starter 依赖(如 spring-boot-starter)。
  2. 开启定时任务支持
    在主启动类上添加 @EnableScheduling
@SpringBootApplication
@EnableScheduling
public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

3. 创建任务类
使用 @Scheduled 注解定义定时任务:

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
public class TaskScheduler {

    @Scheduled(fixedRate = 5000)  // 每5秒执行一次
    public void fixedRateTask() {
        System.out.println("任务按照固定频率执行:" + System.currentTimeMillis());
    }

    @Scheduled(cron = "0 0 12 * * ?")  // 每天中午12点执行
    public void cronTask() {
        System.out.println("任务按照CRON表达式执行:" + System.currentTimeMillis());
    }
}

4. @Scheduled 参数详解

  • fixedRate: 上次任务开始后间隔多久执行(以毫秒为单位)。
  • fixedDelay: 上次任务结束后间隔多久执行。
  • cron: 使用 CRON 表达式定义复杂的调度规则。

2. 使用 ScheduledExecutorService

如果任务管理需要更灵活,可以使用 Java 自带的线程池。

示例:

import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

@Component
public class ExecutorTask implements CommandLineRunner {

    @Override
    public void run(String... args) throws Exception {
        ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(2);

        // 固定频率执行
        scheduler.scheduleAtFixedRate(() -> {
            System.out.println("FixedRate任务:" + System.currentTimeMillis());
        }, 0, 5, TimeUnit.SECONDS);

        // 延迟执行
        scheduler.scheduleWithFixedDelay(() -> {
            System.out.println("FixedDelay任务:" + System.currentTimeMillis());
        }, 0, 5, TimeUnit.SECONDS);
    }
}

3. 使用 Quartz 框架

Quartz 是一个功能更丰富的任务调度框架,适合复杂需求。

步骤:

  1. 添加依赖
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-quartz</artifactId>
</dependency>

2. 配置 Quartzapplication.propertiesapplication.yml 中配置 Quartz 属性,例如:

spring.quartz.job-store-type=memory
spring.quartz.thread-pool.thread-count=5

3. 定义 Job 创建一个 Quartz 任务类,继承 Job 接口:

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

public class QuartzJob implements Job {
    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        System.out.println("Quartz任务执行:" + System.currentTimeMillis());
    }
}

4. 创建任务调度器 使用 JobDetailTrigger 定义任务和触发条件:

import org.quartz.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class QuartzConfig {

    @Bean
    public JobDetail jobDetail() {
        return JobBuilder.newJob(QuartzJob.class)
            .withIdentity("QuartzJob")
            .storeDurably()
            .build();
    }

    @Bean
    public Trigger trigger() {
        return TriggerBuilder.newTrigger()
            .forJob(jobDetail())
            .withIdentity("QuartzTrigger")
            .withSchedule(CronScheduleBuilder.cronSchedule("0/5 * * * * ?"))  // 每5秒触发
            .build();
    }
}

选择适合的方式

  • 简单任务: 使用 @Scheduled,易于实现。
  • 需要线程池支持: 使用 ScheduledExecutorService
  • 复杂任务调度: 使用 Quartz 框架。

如果您对某种方式需要更详细的解释或具体问题,请随时提出!

发布者:myrgd,转载请注明出处:https://www.object-c.cn/4583

Like (0)
Previous 2024年11月26日 下午12:13
Next 2024年11月26日 下午1:03

相关推荐

  • 浏览器跨域请求中携带 Cookie需要同时在前端和后端进行配置

    浏览器跨域请求中,要让请求携带 Cookie,需要同时在前端和后端进行配置。以下是实现的方法: 前端配置 在前端代码中使用 fetch 或 Axios 发起请求时,需要设置 credentials 属性: 1. Fetch 示例 2. Axios 示例 后端配置 在后端需要允许跨域请求,并确保 Cookie 能够正常传递。 1. 设置 Access-Cont…

    2024年12月9日
    00
  • 在使用 Kettle 9.1 连接 MySQL 时,遇到错误提示 Connection failed. Verify all connection parameters and confirm that the appropriate driver is installed.

    在使用 Kettle 9.1 连接 MySQL 时,遇到错误提示 Connection failed. Verify all connection parameters and confirm that the appropriate driver is installed. 通常是由于以下几个原因导致的: 1. MySQL 驱动未正确配置Kettle 需要…

    2024年11月27日
    00
  • Docker快速部署Nginx、Redis、MySQL、Tomcat以及制作镜像方法

    使用 Docker 快速部署 Nginx、Redis、MySQL、Tomcat 以及制作镜像 通过 Docker,开发者可以快速部署和管理各种服务。本文介绍如何快速使用 Docker 部署 Nginx、Redis、MySQL 和 Tomcat,以及如何制作自定义镜像。 1. Docker 基础准备 安装 Docker 如果还未安装 Docker,可按照以下步…

    2024年11月26日
    00
  • 使用 Redis 和 Spring Cache 实现基于注解的缓存功能

    Spring Cache 提供了一种简单的方法来通过注解对方法的返回结果进行缓存。结合 Redis,可以构建一个高效的分布式缓存解决方案。以下是详细实现步骤: 1. 引入必要的依赖在 pom.xml 文件中添加以下依赖(适用于 Spring Boot 项目): 2. 配置 Redis在 application.yml 或 application.proper…

    2024年12月1日
    00
  • Android Studio 国内镜像,加速下载和构建过程

    在国内使用 Android Studio 时,由于访问 Google 的官方资源(如 Gradle 和 SDK)速度较慢甚至无法访问,可以通过配置国内镜像源来加速下载和构建过程。以下是详细配置步骤: 1. 配置 Gradle 国内镜像 Gradle 是 Android Studio 构建项目的重要工具,其依赖库通常托管在 Google Maven 和 JCe…

    2024年11月25日
    00
  • 微信小程序开发中使用 Tailwind CSS 提高开发效率和代码的可维护性

    Tailwind CSS 是一个利用原子化 CSS 类来构建用户界面的框架,在微信小程序开发中使用 Tailwind CSS 可以提高开发效率和代码的可维护性。以下是在微信小程序中使用 Tailwind CSS 进行原子 CSS 开发的具体步骤: 安装 Tailwind CSS 配置 Tailwind CSS 引入样式:在微信小程序的全局样式文件app.wx…

    2024年12月15日
    00
  • 在 Jupyter Notebook 中使用 Markdown 的相关技巧

    在 Jupyter Notebook 中使用 Markdown 是一种常见的方式来撰写文档和注释,增强数据分析和报告的可读性。Markdown 在 Jupyter Notebook 中不仅支持标准的文本格式化功能,还提供了许多扩展功能,比如数学公式、表格、代码块等。以下是一些常用的 Markdown 技巧,可以帮助你提升 Jupyter Notebook 中…

    2024年11月27日
    00
  • 开源模型-LangChain 记忆组件-RedisChatMessageHistory正确使用

    在构建基于 LangChain 的对话式 AI 系统时,记忆组件(Memory)是实现上下文保持的重要模块,而 RedisChatMessageHistory 是基于 Redis 实现的聊天消息存储和检索机制。以下是正确使用 RedisChatMessageHistory 的方法及高阶应用说明。 1. 环境准备在使用 RedisChatMessageHist…

    2024年11月28日
    00
  • Llama-Factory 用于大语言模型开发、微调、量化和优化的工具

    Llama-Factory 是一个用于大语言模型开发、微调、量化和优化的工具。针对量化部分,它旨在通过精度压缩的方式减少模型大小和推理时间,同时尽可能保持模型的性能。以下是关于 Llama-Factory 量化部分的详细说明和流程: 1. 为什么需要量化?减少模型大小:传统的大模型通常使用 16-bit 或 32-bit 浮点数表示权重,占用大量存储和内存。…

    2024年12月2日
    00
  • 通过 PHP 读取微软邮箱(Outlook/Office 365 邮箱)

    通过 PHP 读取微软邮箱(Outlook/Office 365 邮箱)邮件,通常需要使用 Microsoft Graph API,因为微软逐步淘汰了基于用户名和密码的 IMAP/SMTP 方式。Microsoft Graph API 支持 OAuth2.0 认证,可以安全地访问和管理用户邮件。 以下是实现读取微软邮箱邮件的完整示例。 实现步骤 1. 准备工…

    2024年11月25日
    00
  • 微信小程序的 RequestTask.onChunkReceived 接口接收二进制数据流

    微信小程序的 RequestTask.onChunkReceived 接口允许接收分块的二进制数据流(如视频或音频流),但在小程序环境中,由于不支持 TextDecoder,处理这些数据时需要采用其他方法。 解析数据流的方案 模拟 TextDecoder 功能 如果需要将 ArrayBuffer 转换为字符串(如 UTF-8 编码),可以通过自定义方法模拟 …

    2024年11月26日
    00
  • Java Spring MVC 超详解介绍

    Spring MVC 是 Spring 框架中用于构建 Web 应用程序的模块,它采用了 MVC 模式(Model-View-Controller)。Spring MVC 的核心目标是将业务逻辑、数据层、以及展示层分离,使得代码清晰易维护。 Spring MVC 的架构 1. 核心组件 Spring MVC 工作流程 Spring MVC 核心注解 1. @…

    2024年11月21日
    00
  • 在 Apache Spark 中,任务的切分(Task Division)机制

    在 Apache Spark 中,任务的切分(Task Division)是 Spark 将应用程序逻辑划分为多个并行任务的核心机制。任务切分的主要原则是基于数据分区和操作算子。以下是任务切分的核心原则和关键影响因素: 1. Spark 任务切分的基本概念 2. 任务切分的原则 2.1 基于分区(Partition)的切分 2.2 基于依赖关系(Depend…

    2024年11月25日
    00
  • 微信小程序中,通过Node.js连接本地 MySQL 实现数据的增删改查

    在微信小程序中,通过Node.js连接本地 MySQL 实现数据的增删改查的过程,可以分为以下几个步骤: 1. 准备工作 必要工具: 2. 搭建 Node.js 后端服务 安装依赖 在 Node.js 项目中,使用 npm init 初始化项目,并安装以下依赖: express: 用于搭建 Web 服务。 mysql: 用于连接和操作 MySQL 数据库。 …

    2024年12月9日
    00
  • 高性能 TongRDS 是一种分布式内存数据缓存中间件

    TongRDS 是一种分布式内存数据缓存中间件,旨在为高性能、高并发的应用场景提供快速的数据访问解决方案。类似于 Redis 或 Memcached,TongRDS 的核心功能围绕内存数据存储和分布式特性展开,同时可能具备特定的优化或扩展能力。 以下是 TongRDS 的可能特性和应用场景总结: 1. 核心特性 分布式缓存架构 高性能存储 灵活的数据模型 扩…

    2024年12月3日
    00

发表回复

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

联系我们

在线咨询: QQ交谈

邮件:723923060@qq.com

关注微信