让我干一遍也就罢了,居然还一次次的要我给你,当我好欺负吗?

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,高可用系列 2核4GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 让我干一遍也就罢了,居然还一次次的要我给你,当我好欺负吗?

许雪里,简称XXL,业内高手,主要作品有XXL-JOB,XXL-SSO等

XXL-JOB主要解决的是分布式任务调度问题。传统的调度任务,主要有以下几种解决方法:

  1. Thread 线程轮训
  2. Timer 定期调用
  3. Quartz 作业调度
  4. ElasticJob 分布式任务

相对来说,技术方案最成熟的是Quartz,一个纯Java的任务管理库,包括任务定义job,触发器trigger,特别是提出的cron表达式,几乎奠定整个时间规则的基础。

cron的格式一般为0 15 8 ? * * 的六位格式,分别代表秒分时日月周,可以组合成变化多样的条件,例如,每天、每周、几点几分执行等等。

按道理quartz可以解决所有的问题了,但随着分布式、微服务的大规模应用,暴露出一些新的问题,比如说:

  1. cron需要写在类或配置文件里,修改需要重启
  2. 处于集群环境下,存在重复执行任务的情况
  3. 任务的执行情况很难监控,尤其是执行错误
  4. 一个项目里,如果有多个任务,可能很难查找和管理

一个先进的理念,往往会在带来便利的同时,引发一系列难以预料的问题。幸好通过XXL-JOB的使用,可以解决这些问题。

先来了解一下XXL-JOB的内容,他是一个任务管理工具,你可以理解他是一个管理平台,与业务无关,甚至可以一个控制台管理多个不同系统。简单来说他就是一个图形化界面的job admin dashboard,里面包含针对任务的增删改查、监控、配置等功能。

前提

  1. 我们自己有个独立的应用系统,假设是一个springboot项目,功能已经开发完成
  2. 该系统里有几个java方法,需要定期执行,有的需要每天夜间执行,有的需要每隔一小时执行一次,等等

典型任务包括:月末数据汇总统计、批量发送短信、微信

目标

  1. 创建2个项目,admin 和 demo 项目
  2. demo项目为一个普通的SpringBoot项目,里面有一个或多个类(方法)作为任务,需要定时执行
  3. admin是xxl官方提供的管理组件,直接下载后部署即可,用于配置demo的任务执行和监控

准备工作

  • JDK 8
  • MySQL 5.7
  • 以xxl job 2.4版本为示范

git clone https://gitee.com/xuxueli0323/xxl-job.git

doc/db/tables_xxl_job.sql 是MySQL版本的建表语句,请先自行建库建表

admin是管理系统,必要,需要数据库,我们主要用这个

core是公共依赖,必要

samples是示例任务类,非必要,里面有个SampleXxlJob

用git打开项目,打开其中的xxl-job-admin,修改resource的application.properties

# 主要修改内容:数据库地址,账号密码等
server.port=10000
spring.datasource.url=jdbc:mysql://localhost:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai
spring.datasource.username=xxl
spring.datasource.password=xxlpass
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

改完之后,先尝试运行xxl-job-admin,如果运行成功,可以选择打包运行,将xxl整个工程执行package即可,然后在admin的target下,会有xxl-job-admin-2.4.0-SNAPSHOT.jar文件,可以通过java -jar方式,在服务器运行。

浏览器访问 http://localhost:10000/xxl-job-admin,可以看到登录界面了。

默认账密为 admin / 123456

建议进入“用户管理”菜单,对管理用户进行设置。管理员可以设置所有任务,而普通用户只能修改具体某几个任务。

执行器

执行器对admin来说,是一个外部的应用节点。

执行器需要一个名字,并且执行器内可以有多个任务执行类(JobHandler)

先新建一个Springboot项目demo,pom关键内容如下:

<dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
 <groupId>com.xuxueli</groupId>
 <artifactId>xxl-job-core</artifactId>
 <version>2.3.0</version>
</dependency>
<!-- 如果maven识别不到2.4.0,也可以写2.3.0 -->

然后配置该项目的yml文件

server:
 port: 8080
 servlet:
 context-path: /demoapp
xxl:
 job:
 enable: true
 admin:
  addresses: http://localhost:10000/xxl-job-admin
 accessToken:
 executor:
  appname: first-executor
  address:
  ip:
  port: 9090
  logpath:
  logretentiondays: 30

其中,admin.addresses是前面我们配置的admin管理地址,appname为本项目的执行器名称,port是本项目与admin通讯的端口

另外需要一个配置类

@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;
 }
}

这样,执行器就可以用了

任务类

任务类就是一个Java执行类,书写一个方法,然后xxljob就可以设置这个类的触发时机。

每个项目可以有多个任务类,彼此之间没有关系。

例如,可以在demo项目里写10个任务类,但通过admin,只运行其中的一个或几个。

先写一个简单方法如下:

@Component
public class HelloJob {
 private static final Logger log = LoggerFactory.getLogger(HelloJob.class);
 @Resource
 private TestService testService;
 //这里的demoSaveData就是我们自己定义的jobhandler的名字
 @XxlJob("demoSaveData") 
 public void saveData() {
  log.info("hello world");
  testService.saveObject();
 }
}

现在我们的项目通过config配置了执行器,又建立了任务类,接下来需要配置让他运行。

配置任务执行

先分别启动admin项目和demo项目

进入admin控制台,菜单-执行器管理

点击新增,Appname输入demo的yml文件里的first-executor,名称写第一个执行器,注册方式自动

保存后等待,启动demo项目,过一会就会显示Online机器1台,表示找到了我们的项目。

点击菜单-任务管理

点击新增,执行器选“第一个执行器”,描述和负责人随意写,调度类型cron,表达式写0/5 * * * * ? ,每5秒执行一次。保存

回到列表,点击操作-启动,如果顺利,在项目控制台,就会每5秒看到输出的日志了。

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
12月前
|
XML Java 数据格式
【SpringFramework】Spring初体验
Spring是一款由Rod Johnson创立的主流Java EE轻量级开源框架,它旨在简化Java企业级项目开发,提供一站式轻量级解决方案,取代复杂的EJB。Spring的核心功能包括IoC(控制反转)和AOP(面向切面编程),并支持非侵入式开发、组件化和容器管理。这篇文章简要描述相关知识点和初始springframework。
482 60
【SpringFramework】Spring初体验
|
6月前
|
Linux 网络安全 数据安全/隐私保护
使用Linux系统的mount命令挂载远程服务器的文件夹。
如此一来,你就完成了一次从你的Linux发车站到远程服务器文件夹的有趣旅行。在这个技术之旅中,你既探索了新地方,也学到了如何桥接不同系统之间的距离。
1044 21
|
安全 编译器 Linux
【c语言】轻松拿捏自定义类型
本文介绍了C语言中的三种自定义类型:结构体、联合体和枚举类型。结构体可以包含多个不同类型的成员,支持自引用和内存对齐。联合体的所有成员共享同一块内存,适用于判断机器的大小端。枚举类型用于列举固定值,增加代码的可读性和安全性。文中详细讲解了每种类型的声明、特点和使用方法,并提供了示例代码。
152 3
|
网络协议 Linux 网络安全
AnolisOS8.6做NFS服务端,挂载失败 mount: RPC: Unable to receive; errno = Connection refused
anolis8.6安装nfs服务端,在显示共享目录时,始终报错
|
C语言
C语言:写一个函数返回参数二进制中 1 的个数(三种思路)-1
思路一:使用 %2 和 /2 取出每一位并判断 总体思路: (一). 创建函数,参数要设置成无符号整数,设置计数器计算1的个数 (二). 使用 while循环 循环判断二进制每一位, 使用 %2 判断最低位是否为 1, 使用 /2 去掉判断了的最低位,下次循环开始判断新的最低位
168 0
 C语言:写一个函数返回参数二进制中 1 的个数(三种思路)-1
|
1天前
|
云安全 监控 安全
|
6天前
|
机器学习/深度学习 人工智能 自然语言处理
Z-Image:冲击体验上限的下一代图像生成模型
通义实验室推出全新文生图模型Z-Image,以6B参数实现“快、稳、轻、准”突破。Turbo版本仅需8步亚秒级生成,支持16GB显存设备,中英双语理解与文字渲染尤为出色,真实感和美学表现媲美国际顶尖模型,被誉为“最值得关注的开源生图模型之一”。
770 5
|
12天前
|
人工智能 Java API
Java 正式进入 Agentic AI 时代:Spring AI Alibaba 1.1 发布背后的技术演进
Spring AI Alibaba 1.1 正式发布,提供极简方式构建企业级AI智能体。基于ReactAgent核心,支持多智能体协作、上下文工程与生产级管控,助力开发者快速打造可靠、可扩展的智能应用。
1030 37
|
8天前
|
机器学习/深度学习 人工智能 数据可视化
1秒生图!6B参数如何“以小博大”生成超真实图像?
Z-Image是6B参数开源图像生成模型,仅需16GB显存即可生成媲美百亿级模型的超真实图像,支持中英双语文本渲染与智能编辑,登顶Hugging Face趋势榜,首日下载破50万。
584 36