@Scheduled,Quartz,XXL-JOB三种定时任务总结

@Scheduled,Quartz,XXL-JOB三种定时任务总结

一、@Scheduled

简介

@Scheduled 是 Spring 框架中用于声明定时任务的注解。通过使用 @Scheduled 注解,你可以指定一个方法应该在何时执行,无需依赖外部的调度器。

这个注解通常与@EnableScheduling 注解一起使用,后者用于启用 Spring 的任务调度功能。当在一个类的方法上使用 @Scheduled 注解时,Spring 框架会自动创建一个定时任务,并按照指定的规则执行该方法。

简单使用

首先建好一个Spring Boot项目,在启动类上加@EnableScheduling开启Spring的任务调度功能,创建一个类,再其方法上加上注解@Scheduled,通过cron表达式来指定什么时候执行该方法。

@SpringBootApplication
@EnableScheduling
public class Main {public static void main(String[] args) {SpringApplication.run(Main.class);}
}
@Component
public class ScheduleTest {@Scheduled(cron = "0/3 * * * * ?")public void testScheduled() {//每3秒执行一次System.out.println("你好");}
}

image-20231204205531391

二、Quartz

简介

Quartz是一个开源的、功能强大且灵活的作业调度框架,它支持复杂的调度需求,作业持久化、集群部署等功能。它允许你按照设定的时间规则执行特定的任务,例如定时执行、循环执行、间隔执行等。Quartz可以与Spring等框架无缝集成,被广泛应用于企业级应用中。

简单使用

pom.xml中导入依赖

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

创建一个定时器任务类,实现QuartzJobBean接口的方法

public class QuartzTest extends QuartzJobBean {@Overrideprotected void executeInternal(JobExecutionContext context) throws JobExecutionException {System.out.println("我是Quartz,你好");}
}

创建Quartz配置类,构建定时任务触发器

@Configuration
public class QuartzConfig {@Beanpublic JobDetail jobDetail() {return JobBuilder.newJob(QuartzTest.class).storeDurably(true).build();}@Beanpublic Trigger trigger() {return TriggerBuilder.newTrigger().forJob(jobDetail()).withSchedule(CronScheduleBuilder.cronSchedule("0/3 * * * * ?")).build();}
}

项目启动后,你就能看到控制台每3秒就会打执行一次

image-20231204210647717

三、XXL-Job

简介

XXL-JOB是一个分布式任务调度平台,用于在分布式系统中进行任务调度和管理。XXL-JOB提供了可视化的任务管理界面、任务的动态添加、修改、删除等功能。它支持分布式部署,并提供了任务执行日志、任务运行状态等监控功能。XXL-Job是为了解决分布式系统中任务调度的问题而设计的,适合于大规模分布式系统中的定时任务调度。

简单使用

使用docker-compose安装

查找镜像,选择xuxueli/xxl-job-admin

[root@localhost /]# docker search xxl-job
NAME                                              DESCRIPTION                                      STARS     OFFICIAL   AUTOMATED
vulhub/xxl-job                                                                                     1                    
xuxueli/xxl-job-admin                             A lightweight distributed task scheduling fr…   150       

新建一个目录xxl-job,在它下面建一个logs目录和一个docker-compose.yml文件

[root@localhost xxl-job]# pwd
/usr/local/software/xxl-job
[root@localhost xxl-job]# ls
docker-compose.yml  logs

编辑docker-compose.yml(每个人的MySQL地址和ip不一样注意修改)

version: '2'
#自定义的docker网络
networks:wn_docker_net:external: true
services:xxl-job-compose:#读取Dockerfile#build: .#镜像名称image: xuxueli/xxl-job-admin:2.3.1#容器名称container_name: xxl-jobports:- '9898:8080'environment:PARAMS: '--spring.datasource.url=jdbc:mysql://192.168.100.128:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai--spring.datasource.username=root--spring.datasource.password=123'volumes:- /usr/local/software/xxl-job/logs:/data/applogsnetworks:wn_docker_net:ipv4_address: 172.18.12.100

进入xxl-job官网https://www.xuxueli.com/xxl-job/的github或gitee里的doc/db目录下找到建库语句tables_xxl_job.sql建数据库

docker-compose up -d后台构建执行

浏览器输入(你自己虚拟机的ip)192.168.100.128:9898/xxl-job-admin,用户为建库后的xxl_job_user表中的数据

image-20231204211632865

image-20231204211727635

Spring Boot整合XXL-Job

导入依赖

<dependency><groupId>com.xuxueli</groupId><artifactId>xxl-job-core</artifactId><version>2.4.0</version>
</dependency>

配置application-xxljob.yml,进行一些执行器的配置

server:port: 13000#xxljob的配置
xxl:job:admin:addresses: http://192.168.100.128:9898/xxl-job-admin/executor:appname: xxl-job-executor-sampleport: 9777accessToken: default_tokenlogging:level:com.wnhz.ssc: debug

创建XxlJobConfig配置类,导入刚才在yml文件中的配置

@Configuration
@Slf4j
public class XxlJobConfig {@Value("${xxl.job.admin.addresses}")private String addresses;@Value("${xxl.job.executor.appname}")private String appName;@Value("${xxl.job.executor.port}")private int port;@Value("${xxl.job.accessToken}")private String accessToken;@Beanpublic XxlJobSpringExecutor xxlJobExecutor() {XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();xxlJobSpringExecutor.setAdminAddresses(addresses);xxlJobSpringExecutor.setAppname(appName);xxlJobSpringExecutor.setPort(port);xxlJobSpringExecutor.setAccessToken(accessToken);log.debug("xxl-job初始化成功:{}", xxlJobSpringExecutor);return xxlJobSpringExecutor;}
}

创建XxlJob定时任务

@Slf4j
@Component
public class MyXxlJob {@XxlJob("hello-xxljob")public void job() {log.debug("我的第一个xxljob");}
}

在XXL-Job任务调度中心中的任务管理中添加任务

点击新增

image-20231204212635364

启动spring项目

点击启动

image-20231204212840897

可以看到xxl-job启动成功

总结

Schedule是计划执行任务的通用术语。Quartz是Java任务调度框架,支持灵活任务管理。XXL-JOB是分布式任务调度平台,注重大规模系统,提供分布式任务调度和管理,包括动态调度、监控、日志记录等功能。选择取决于应用需求,Quartz适用于Java应用,XXL-JOB适用于分布式环境。

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

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

相关文章

javascript object转换成json格式

JavaScript中object与json的转换 1、JSON字符串: var str1 { "name": "cxh", "sex": "man" };2、JSON对象: var str2 { "name": "cxh", "sex": "man" };3、JSON字符串转换为JSON对象 要使…

判断是否存在重复的数

系列文章目录 进阶的卡莎C_睡觉觉觉得的博客-CSDN博客数1的个数_睡觉觉觉得的博客-CSDN博客双精度浮点数的输入输出_睡觉觉觉得的博客-CSDN博客足球联赛积分_睡觉觉觉得的博客-CSDN博客大减价(一级)_睡觉觉觉得的博客-CSDN博客小写字母的判断_睡觉觉觉得的博客-CSDN博客纸币(C…

(C语言)通过循环按行顺序为一个矩阵赋予1,3,5,7,9,等奇数,然后输出矩阵左下角的值。

#include<stdio.h> int main() {int a[5][5];int n 1;for(int i 0;i < 5;i ){for(int j 0;j < 5;j ){a[i][j] n;n 2;}}for(int i 0;i < 5;i ){for(int j 0;j < i;j )printf("%-5d",a[i][j]);printf("\n");}return 0; } 运行截图…

深入理解JVM内存空间的担保策略

Java虚拟机&#xff08;JVM&#xff09;的内存管理是Java性能调优中最重要的方面之一&#xff0c;特别是在处理大型应用和服务时。JVM内存管理的一个关键组成部分是垃圾回收&#xff08;GC&#xff09;。在GC过程中&#xff0c;JVM需要确保有足够的内存来创建新对象&#xff0c…

STM32串口接收不定长数据(空闲中断+DMA)

玩转 STM32 单片机&#xff0c;肯定离不开串口。串口使用一个称为串行通信协议的协议来管理数据传输&#xff0c;该协议在数据传输期间控制数据流&#xff0c;包括数据位数、波特率、校验位和停止位等。由于串口简单易用&#xff0c;在各种产品交互中都有广泛应用。 但在使用串…

Java中的锁

Java常见锁 【超全面】_java锁-CSDN博客 一文看懂Java中的锁 - 知乎 一文读懂 Java 中的各种锁 - 知乎 java中锁的分类总结_java string 锁-CSDN博客 https://www.cnblogs.com/hangychn/p/17184814.html https://www.cnblogs.com/durenniu/p/10949491.html 锁-Java - 知…

【LeeCode】链表总结

理论基础 链表的种类主要为&#xff1a;单链表&#xff0c;双链表&#xff0c;循环链表 链表的存储方式&#xff1a;链表的节点在内存中是分散存储的&#xff0c;通过指针连在一起。 链表是如何进行增删改查的。 数组和链表在不同场景下的性能分析。 经典题目 虚拟头节点 …

Passkey模式

以下内容参考自谷歌的代码&#xff1a; 原文地址 Passkey 模式用于以比简单地将其他类设置为友元类更细粒度的方式将类的部分方法暴露给另一个类。本质上&#xff0c;它涉及创建一个“passkey”类&#xff0c;该类只能由特定的其他类构造&#xff0c;并要求在调用您希望限制使…

手把手教你做基于stm32的红外、语音、按键智能灯光控制(下)

目录&#xff1a; 4.6. DHT11温湿度传感器模块4.7. 语音识别模块4.7. OLED显示屏模块 5. 不同的工作模式6. 总结 在接着&#xff08;上&#xff09;写之前&#xff0c;首先来看一下效果&#xff1a; 链接: link 需要源码什么的可以私信我哦 4.6. DHT11温湿度传感器模块 这个…

C陷阱与缺陷——第2章语法陷阱

1. 理解函数声明 硬件将调用首地址为0位置的子例程 (*(void(*)())0)(); 任何C变量的声明都由两部分组成&#xff1a;类型以及一组类似表达式的声明符&#xff0c;声明符从表面看与表达式有些类似&#xff0c;对它求值应该返回一个声明中给定类型的结果。 假定变量fp是一个函…

[go 面试] 构建高效微服务通信:选择合适的通信方式

关注公众号【爱发白日梦的后端】分享技术干货、读书笔记、开源项目、实战经验、高效开发工具等&#xff0c;您的关注将是我的更新动力&#xff01; 构建分布式系统或微服务架构时&#xff0c;服务间通信成为至关重要的一环。不同的通信方式各有优劣&#xff0c;因此在选择时需根…

数据库sql是什么?

数据库是什么&#xff1f; 为了将数据持久保存&#xff0c;java中的对象都是在内存中&#xff0c;程序结束数据就会销毁&#xff0c;在学习IO过程中将数据存储在文件中&#xff0c;但是内容整体是字符串&#xff0c;使用起来不方便。所以需要数据库长久保存数据还便于提取 数…

值和引用的传递与初始化块

值&#xff1a;1.基本类型数据&#xff1b;2.对象的地址 引用&#xff1a;传句柄的地址 在java中只有按值传递没有按引用传递&#xff0c;c语言也只有按值传递&#xff0c;只有c才有引用传递。 块&#xff1a; 静态块>块>构造方法 package com;public class Person {pri…

揭秘预付费电表怎么无线收费——方便快捷收费

【摘要】针对目前市场上普遍以Ic卡作为售电介质的预付费售电系统存在的问题&#xff0c;介绍了一种新型的无线预付费售电系统及其构成&#xff0c;并给出了整个系统设计的完整方案。整个系统包括用户终端和电力管理系统端&#xff0c;它们之间通过双工通信可以将用户用电信息和…

Kubernetes存储搭建NFS挂载失败处理

搞NFS存储时候发现如下问题&#xff1a; Events:Type Reason Age From Message---- ------ ---- ---- -------Normal Scheduled 5m1s default-scheduler Successful…

JavaScrip之函数柯理化、参数复用、提前确认、延迟执行

MENU 1、参数复用2、提前确认 (惰性函数)3、延迟运行4、初步封装5、递归封装6、经典面试题 1、参数复用 // 普通函数验证 function check(regExp, text) {return regExp.test(text); }console.log(check(/^\d$/g, 123)); // true console.log(check(/^\d$/g, 2d)); // false…

LeetCode算法练习top100:(7)递归回溯

package top100.递归回溯;import java.util.*;public class TOP {//46. 不含重复数字的全排列List<List<Integer>> res new ArrayList<>();public List<List<Integer>> permute(int[] nums) {LinkedList<Integer> path new LinkedList&l…

电子学会全国青少年软件编程等级考试 中小学生python一级历年真题解析【更新至2023年9月 持续更新】

中国电子学会python等级考试一级历年真题解析 一、考级知识点分析 一、 了解Python多种开发环境&#xff0c;熟练使用Python自带的IDLE开 发环境&#xff0c;能够进行程序编写、调试和分析&#xff0c;具备使用Python开发 环境进行程序设计的能力 了解Python常见的几种编程环…

堆排序详细解读

简介 堆排序是一种基于二叉堆数据结构的排序算法&#xff0c;它的特点是不同于传统的比较排序算法&#xff0c;它是通过建立一个堆结构来实现的。堆排序分为两个阶段&#xff0c;首先建立堆&#xff0c;然后逐步将堆顶元素与堆的最后一个元素交换并调整堆&#xff0c;使得最大…

EM32DX-C2【C#】

1说明&#xff1a; 分布式io&#xff0c;CAN总线&#xff0c;C#上位机二次开发&#xff08;usb转CAN模块&#xff09; 2DI&#xff1a; 公共端是&#xff1a; 0V【GND】 X0~X15&#xff1a;自带24v 寄存器地址&#xff1a;0x6100-01 6100H DI输入寄存器 16-bit &#x…