【Spring Boot】定时任务

news2024/9/24 1:19:12

目录

前言

定时任务注解@Scheduled

设计一个定时任务

1.启用定时任务

2.创建定时任务

Cron 表达式详解

多线程定时任务

总结

定时任务框架xxl-job

SpringBoot继承定时任务框架

1.搭建调度中心xxl-job-admin

1.1下载项目

1.2修改配置文件端口和数据库代码

1.3连接到本地数据库,运行 db.sql

1.4启动项目,进行访问

2.在SpringBoot中运用

2.1引入依赖

 2.2编写配置文件

2.3编写xxlJob配置类

2.4创建定时任务

任务的运行与管理

高级功能

总结 


前言

在Spring Boot中,定时任务的实现通常使用@Scheduled注解。@Scheduled可以用于在指定的时间间隔或特定的时间点执行任务。Spring提供了多种方式来配置定时任务,如使用固定速率,固定延迟或Cron表达式等。如果是分布式系统或者想要时间可以灵活变化,可以选择一些定时任务框架xxl-job,elastic-job等

定时任务注解@Scheduled

设计一个定时任务

1.启用定时任务

首先,需要在 Spring Boot 应用中启用定时任务功能。可以在应用的主类或配置类中添加 @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);
    }
}

2.创建定时任务

接下来,可以创建一个带有 @Scheduled 注解的方法来定义定时任务。以下是几种常见的定时任务配置方式:

2.1. 固定速率执行任务

@Scheduled(fixedRate = 5000) 表示每隔 5 秒执行一次任务。任务的开始时间之间间隔是固定的。

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

@Component
public class MyScheduledTask {

    @Scheduled(fixedRate = 5000)
    public void executeTask() {
        System.out.println("Fixed rate task executed at " + System.currentTimeMillis());
    }
}

2.2. 固定延迟执行任务

@Scheduled(fixedDelay = 5000) 表示任务在上一个任务完成后的 5 秒后执行。任务完成时间和下一个任务开始时间之间的间隔是固定的。

@Component
public class MyScheduledTask {

    @Scheduled(fixedDelay = 5000)
    public void executeTask() {
        System.out.println("Fixed delay task executed at " + System.currentTimeMillis());
    }
}

2.3. 使用 Cron 表达式

@Scheduled(cron = "0 0/1 * * * ?") 表示每分钟的开始执行任务。Cron 表达式提供了更灵活和精确的时间控制。

@Component
public class MyScheduledTask {

    @Scheduled(cron = "0 0/1 * * * ?")
    public void executeTask() {
        System.out.println("Cron expression task executed at " + System.currentTimeMillis());
    }
}

Cron 表达式详解

Cron 表达式的格式如下:

秒 分 时 日 月 星期 [年]
  • :0-59
  • :0-59
  • :0-23
  • :1-31
  • :1-12
  • 星期:0-7(0 和 7 都表示周日)

常见的 Cron 表达式例子:

  • "0 0 12 * * ?" :每天中午 12 点执行
  • "0 15 10 ? * *":每天上午 10:15 执行
  • "0 0/5 * * * ?":每 5 分钟执行一次
  • "0 0 0 1 1 ?":每年 1 月 1 日午夜执行

多线程定时任务

默认情况下,所有的定时任务都在单线程中执行。如果你希望并发执行多个定时任务,可以自定义 TaskScheduler

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;

@Configuration
public class SchedulingConfig {

    @Bean
    public ThreadPoolTaskScheduler taskScheduler() {
        ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
        scheduler.setPoolSize(10);  // 设置线程池大小
        scheduler.setThreadNamePrefix("scheduled-task-");
        return scheduler;
    }
}

总结

在 Spring Boot 中,通过使用 @Scheduled 注解和配置定时任务,你可以轻松实现各种类型的定时任务,如固定速率执行、固定延迟执行、基于 Cron 表达式的定时任务等。根据需求,还可以配置多线程调度器或使用配置文件来动态管理定时任务的执行行为。

定时任务框架xxl-job

XXL-JOB 是一个分布式任务调度平台,旨在解决分布式系统中的任务调度问题。相比于 Spring Boot 自带的 @Scheduled 注解,XXL-JOB 提供了更加灵活和强大的任务调度能力,支持集群模式下的任务调度、任务的可视化管理、任务的失败重试等功能。

SpringBoot继承定时任务框架

1.搭建调度中心xxl-job-admin

1.1下载项目

https://github.com/xuxueli/xxl-job

1.2修改配置文件端口和数据库代码

1.3连接到本地数据库,运行 db.sql

1.4启动项目,进行访问

用户名:admin,密码:123456,这个是默认初始化的用户名和密码

2.在SpringBoot中运用

2.1引入依赖

首先,在你的 Spring Boot 项目中引入 XXL-JOB 的依赖。可以在 pom.xml 文件中添加以下依赖:

<dependency>
    <groupId>com.xuxueli</groupId>
    <artifactId>xxl-job-core</artifactId>
    <version>2.3.0</version>
</dependency>
 2.2编写配置文件

接下来,需要配置 XXL-JOB。在 application.properties 中添加以下配置:


xxl.job.admin.addresses=http://127.0.0.1:8181/xxl-job-admin
xxl.job.accessToken=default_token册
xxl.job.executor.appname=xxl-job-executor-test
xxl.job.executor.address=
xxl.job.executor.ip=
xxl.job.executor.port=9999
xxl.job.executor.logpath=D:/data/applogs/xxl-job/jobhandler

xxl.job.executor.logretentiondays=30
2.3编写xxlJob配置类
package com.example.excel;

import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class XxlJobConfig {
    private Logger logger = LoggerFactory.getLogger(XxlJobConfig.class);

    @Value("${xxl.job.admin.addresses}")
    private String adminAddresses;

    @Value("${xxl.job.accessToken}")
    private String accessToken;

    @Value("${xxl.job.executor.appname}")
    private String appname;

    @Value("${xxl.job.executor.address}")
    private String address;

    @Value("${xxl.job.executor.ip}")
    private String ip;

    @Value("${xxl.job.executor.port}")
    private int port;

    @Value("${xxl.job.executor.logpath}")
    private String logPath;

    @Value("${xxl.job.executor.logretentiondays}")
    private int logRetentionDays;


    @Bean
    public XxlJobSpringExecutor xxlJobExecutor() {
        XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
        xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
        xxlJobSpringExecutor.setAppname(appname);
        xxlJobSpringExecutor.setAddress(address);
        xxlJobSpringExecutor.setIp(ip);
        xxlJobSpringExecutor.setPort(port);
        xxlJobSpringExecutor.setAccessToken(accessToken);
        xxlJobSpringExecutor.setLogPath(logPath);
        xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);

        return xxlJobSpringExecutor;
    }
}

2.4创建定时任务

要创建一个定时任务,需要在服务中定义一个方法,并使用 @XxlJob 注解标识该方法为任务。

import com.xxl.job.core.handler.annotation.XxlJob;
import org.springframework.stereotype.Component;

@Component
public class MyXxlJob {

    @XxlJob("mySimpleJobHandler")
    public void execute() throws Exception {
        System.out.println("XXL-JOB Task executed at " + System.currentTimeMillis());
    }
}

2.5在 XXL-JOB 管理平台中配置任务

登录后台后, 点击执行器管理,新增执行器

然后在任务配置页面,填写任务的基本信息,如任务名称,执行器,任务描述,CRON表达式等

在“JobHandler”字段中填写 mySimpleJobHandler(即你在代码中定义的 @XxlJob 注解的名称)

任务的运行与管理

配置完成后,你可以在 XXL-JOB 管理后台中手动触发任务执行,也可以根据配置的 CRON 表达式自动调度任务。管理后台还提供了任务执行日志查看、失败重试、任务禁用启用等功能。

高级功能

XXL-JOB 还支持一些高级功能,如:

  • 任务分片:在集群模式下,将任务分配给多个执行器。
  • 失败重试:任务失败时自动重试。
  • 任务依赖:配置任务之间的依赖关系。
  • 动态参数:支持在任务执行时动态传递参数。

总结 

使用 XXL-JOB,可以轻松实现分布式环境下的定时任务调度,并且通过管理平台实现任务的可视化管理和监控。相比 Spring 的 @Scheduled 注解,XXL-JOB 更适合于复杂的分布式任务调度场景。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2050528.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux进程间通信学习记录(无名管道)

0.Linux进程间通信的方式 &#xff08;1&#xff09;.从UNIX继承过来的通信方式 无名管道&#xff08;pipe&#xff09; 有名管道&#xff08;fifo&#xff09; 信号&#xff08;signal&#xff09; &#xff08;2&#xff09;.System V IPC 共享内存 消息队列 信号灯集 &am…

Java方法03:方法的重载

本节内容视频链接&#xff1a;https://www.bilibili.com/video/BV12J41137hu?p47&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5https://www.bilibili.com/video/BV12J41137hu?p47&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5 在Java中&#xff0c;‌方法的重载&#x…

AI编程系列一1小时完成链家房价爬虫程序

背景 AI编程实在太火&#xff0c;写了很多年的Java&#xff0c;现在Python 和Go 简单好用&#xff0c;今天结合智谱清言快速完成一个程序爬虫程序&#xff0c;没有任何Python 编程经验&#xff0c;只需要会提问&#xff0c;熟悉简单HTML结构即可。未来一定是有业务能力者的福…

Anylogic设置颜色

三维对象的颜色修改 以detector智能体为例&#xff0c;颜色修改代码为&#xff1a; detector.setColor(“Material_(4)_Surf”,blue); 二维对象的颜色修改 house智能体为例&#xff0c;对组件内的_ps282填充的颜色进行修改&#xff0c;level_是该智能体已有的参数或者称之为变…

CLRerNet推理详解及部署实现(下)

目录 前言一、CLRerNet推理(Python)1. CLRerNet预测2. CLRerNet预处理3. CLRerNet后处理4. CLRerNet推理 二、CLRerNet推理(C)1. ONNX 导出2. CLRerNet预处理3. CLRerNet后处理4. CLRerNet推理 三、CLRerNet部署1. 源码下载2. 环境配置2.1 配置CMakeLists.txt2.2 配置Makefile …

python:画由抛物线: y^2=2x 与直线 y=x-4 所围成的图形

《高等数学》同济大学版 P339 编写 test_diff_3_area.py 如下 # -*- coding: utf-8 -*- """ 画由抛物线: y^22x 与直线 yx-4 所围成的图形 """ import numpy as np import matplotlib.pyplot as plt from matplotlib.patches import Polygon…

11结构型设计模式——外观模式

一、外观模式简介 外观模式&#xff08;Facade Pattern&#xff09;是一种结构型设计模式&#xff0c;它提供了一个统一的接口来访问子系统中的一组接口&#xff0c;使得子系统的使用更加简单和方便。通过外观模式&#xff0c;可以将复杂的子系统封装在一个外观类&#xff08;…

​​数据结构-树

n = 度数之和 + 1 n + x + y + z = x +2y +3z + 1

增加练习(修改获取练习的基本信息接口)

文章目录 1.sun-club-practice-api1.enums1.CompleteStatusEnum.java 2.req1.GetPracticeSubjectsReq.java 3.vo1.PracticeSubjectListVO.java 2.sun-club-practice-server1.PracticeSetController.java2.service1.PracticeSetServiceImpl.java 3.dao1.PracticeDao.java2.Pract…

HAL STM32 SG90舵机驱动控制

HAL STM32 SG90舵机驱动控制 &#x1f516;测试对象&#xff1a;STM32F103SG90舵机 &#x1f33c;功能实现&#xff1a;通过串口指令&#xff0c;控制SG90舵机转动到指定角度。 ✨在实际硬件舵机驱动过程中&#xff0c;使用SG90普通舵机空载运转情况下&#xff0c;电流在180mA…

验证集的loss比训练集大得多Val Loss is too large

这个跟数据集有关&#xff0c;不过可已通过clip减缓。 解决方法 nn.utils.clip_grad_norm_(self.Model.parameters(), max_norm5)

AtCoder Regular Contest 182 A~D

A.Chmax Rush!&#xff08;枚举&#xff09; 题意&#xff1a; 有一个长度为 N N N的整数序列 S S S。最初&#xff0c; S S S的所有元素都是 0 0 0。 同时给你两个长度为 Q Q Q的整数序列&#xff1a; P ( P 1 , P 2 , … , P Q ) P(P_1,P_2,\dots,P_Q) P(P1​,P2​,…,PQ…

AI产品经理修炼指南:从青铜到王者的逆袭之路

一、AI通识 1.1 AI产业结构 AI发展至今大致按照在产业结构上的分工不同产生了三种类型的公司&#xff0c;我们在转型时最好要先明确自己的优势及兴趣&#xff0c;来判断自己适合着眼于哪个层面的工作&#xff0c;从而进行针对性的学习和提升。 &#xff08;1&#xff09;行业…

Apache Flink细粒度资源管理原理

粗粒度资源管理 Apache Flink 1.1.4版本之前使用的是粗粒度的资源管理&#xff0c;即每个算子Slot Request所需要的资源都是未知的&#xff0c;Flink内部用UNKNOWN的特殊值来表示&#xff0c;这个值可以和任意资源规则的物理Slot匹配&#xff0c;站在Taskmanager的角度&#x…

打卡学习Python爬虫第二天|Web请求过程刨析

一、服务器渲染 服务器端渲染&#xff08;Server-Side Rendering&#xff0c;简称SSR&#xff09;是一种网页渲染技术。在这种技术中&#xff0c;服务器在接收到客户端的请求后&#xff0c;会生成页面的初始HTML内容&#xff0c;并将其发送给客户端。客户端浏览器接收到这些HT…

什么是BKP(备份寄存器)

一&#xff0c;什么是BKP 备份寄存器是42个16位的寄存器&#xff0c;可用来存储84个字节的用户应用程序数据。他们处在备份域里&#xff0c;当VDD电源被切断&#xff0c;他们仍然由VBAT维持供电。当系统在待机模式下被唤醒&#xff0c;或系统复位或电源复位时&#xff0c;他们也…

数据结构(6.2_2)——领接表法

领接表法&#xff08;顺序存储链式存储&#xff09; 代码&#xff1a; #define MaxVertextNum 10 //边(弧) typedef struct ArcNode {int adjvex;//边/弧指向哪个结点struct ArcNode* next;//指向下一条弧的指针//InfoType info;//边权值 }ArcNode; //顶点 typedef struct VNo…

小阿轩yx-Docker Swarm 管理

小阿轩yx-Docker Swarm 管理 容器编排部署工具 除 Google 推出的 Kubernetes 之外&#xff0c;还有 Docker 发布的 Swarm 与 Mesos 推出的 Marathon 案例一 Docker Swarm 群集部署 Docker 自诞生以来&#xff0c;容器特性以及镜像特性给 DevOps 爱好者带来很多方便很长时间…

基本数据统计分析上|集中位置统计量|分散程度统计量|分布形状统计量|常见概率分布

数据统计分析 现实生活中的许多数据都是随机产生的&#xff0c;如考试分数&#xff0c;月降雨量&#xff0c;灯泡寿命等。从统计角度来看&#xff0c;这些数据其实都是符合某种分布的&#xff0c;这种分布就是统计规律性 在数学建模过程中经常与数据打交道&#xff0c;需要进行…

【鸟哥的Linux私房菜(七)之文件IO】

文章目录 C语言文件IOC语言文件接口汇总什么是当前路径&#xff1f;默认打开的三个流 系统文件I/Oopenopen的第一个参数open的第二个参数open的第三个参数open的返回值 closewriteread 文件描述符fd文件描述符的分配规则重定向重定向的原理dup2添加重定向功能到minishell FILEF…