springboot与xxl-job,附上与docker-compose整合
前言
因为公司内部项目需要经常导出一些报表发给领导,以及很多时候需要定时发送消息,所以需要一个定时任务框架,最好它能够实时修改生效以及页面维护,我们从中选择了XXL-JOBhttps://www.xuxueli.com/xxl-job/。
选型
目前市面上常见的有quartz,我的上家公司就是用quartz, 底层以“抢占式”获取DB锁并由抢占成功节点负责运行任务, 任务多的情况下容易导致经常死锁,非常麻烦,而且没有页面可以维护,查看任务。
第二种就是Elastic-Job,我的上上家公司就是用这套,因为我们当时是用dubbo+zookeeper的框架,所以也很贴切,加上hippo框架可以实现界面维护, 但是我们公司这个项目还没有架构到微服务所以也不准备引入ZK。
XXL-JOB就比较简单使用了,也没有这么高的入侵性,特别是现在还支持GLUE任务,实现在线编辑生效,还能页面维护。
XXL-JOB模式
XXL-JOB 分为 调度中心(XXL-JOB-Admin) 以及执行器(我们自己的项目) , 调度中心就是类似我们微服务的注册中心, 是一个服务发现与治理作用。 而我们的执行器,就是我们的消费者和生产者。
与springboot整合
调度中心搭建
在官网找到下载源码地址:
https://www.xuxueli.com/xxl-job/#1.5%20%E4%B8%8B%E8%BD%BD
有github和gitee选择,我选择从github下载最新的:
https://github.com/xuxueli/xxl-job
打开项目, 找xxl-job-admin的resources对应地址:
xxl-job201\xxl-job-admin\src\main\resources\application.properties
这里我是修改了端口以及数据库账号密码
之后再启动:
成功了:
打开页面 你的ip记得换:
http://192.168.110.195:7999/xxl-job-admin/
那么调度中心搭建就结束了。
执行器(项目)整合
小编之前无论怎么启动调试 都无法注册上服务, 最后是更换为最新的2.3.0版本才解决的这个问题,如果遇到无法注册上服务的,也可以试着使用最新版本。
先下载依赖:
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>2.3.0</version>
</dependency>
编写配置类:
package com.XXXX.core.xxlJob;
import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
/**
* @author rick
* @create 2022/3/7 10:19
*/
@Slf4j
@Component
public class XxlJobConfig {
@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() {
log.info(">>>>>>>>>>> xxl-job config init.");
XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
xxlJobSpringExecutor.setIp(ip);
xxlJobSpringExecutor.setAppname(appname);
xxlJobSpringExecutor.setPort(port);
xxlJobSpringExecutor.setAccessToken(accessToken);
xxlJobSpringExecutor.setLogPath(logPath);
xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);
return xxlJobSpringExecutor;
}
/**
* 针对多网卡、容器内部署等情况,可借助 "spring-cloud-commons" 提供的 "InetUtils" 组件灵活定制注册IP;
*
* 1、引入依赖:
* <dependency>
* <groupId>org.springframework.cloud</groupId>
* <artifactId>spring-cloud-commons</artifactId>
* <version>${version}</version>
* </dependency>
*
* 2、配置文件,或者容器启动变量
* spring.cloud.inetutils.preferred-networks: 'xxx.xxx.xxx.'
*
* 3、获取IP
* String ip_ = inetUtils.findFirstNonLoopbackHostInfo().getIpAddress();
*/
}
在application.yml 中加入对应配置:
1、这里的addresses必须加上端口号,如果你没加上端口号,除非你在nginx中配置了80端口且映射7999服务,否则无法注册到调度中心。
2、appname请填写好,否则无法注册到调度中心。
# xxl-job配置
xxl:
job:
admin:
# 调度中心部署跟地址 [选填]:如调度中心集群部署存在多个地址则用逗号分隔。执行器将会使用该地址进行"执行器心跳注册"和"任务结果回调";为空则关闭自动注册;
addresses: http://192.168.110.195:7999/xxl-job-admin
executor:
# 执行器注册 [选填]:优先使用该配置作为注册地址,为空时使用内嵌服务 ”IP:PORT“ 作为注册地址。从而更灵活的支持容器类型执行器动态IP和动态映射端口问题。
address:
# 执行器AppName [选填]:执行器心跳注册分组依据;为空则关闭自动注册
appname: appname
# 执行器IP [选填]:默认为空表示自动获取IP,多网卡时可手动设置指定IP,该IP不会绑定Host仅作为通讯实用;地址信息用于 "执行器注册" 和 "调度中心请求并触发任务";
ip:
# 执行器端口号 [选填]:小于等于0则自动获取;默认端口为9999,单机部署多个执行器时,注意要配置不同执行器端口;
port: 9999
# 执行器运行日志文件存储磁盘路径 [选填] :需要对该路径拥有读写权限;为空则使用默认路径;
logpath:
# 执行器日志文件保存天数 [选填] : 过期日志自动清理, 限制值大于等于3时生效; 否则, 如-1, 关闭自动清理功能;
logretentiondays: 15
# 执行器通讯TOKEN [选填]:非空时启用;
accessToken:
配置类就写完了.
新增一个任务service(我这里用的是**GLUE**模式,写好代码直接复制到xxl-job中**IDE GLUE**进行保存,代码实时生效,可执行):
如果你要用Bean模式,那么就需要把bean注册到spring中,然后对应的beanName需要@XxlJob(value = "beanName")
到这里,你的执行器配置就写完了。
接下来去调度中心填写你的执行器:
等待一下,会发现服务注册上了。
然后就可以在任务管理 添加自己的任务吧~~~~
与Docker-Compose整合
XXL-JOB 与Docker-Compose原文连接:
https://www.http3w.com/archives/445
下载镜像
docker pull xuxueli/xxl-job-admin:2.3.0
初始化对应版本数据库(xxl_job)
https://github.com/xuxueli/xxl-job/blob/2.3.0/doc/db/tables_xxl_job.sql
因为我的版本是2.3.0,所以默认打开本sql脚本,其他版本可自行选择
创建docker-comopose.yml
这里的ports 我改成了我的内部7999端口(也是和原文不同的地方)。
version: '3'
services:
xxl-job-admin:
image: xuxueli/xxl-job-admin:2.3.0
restart: always
container_name: xxl-job-admin
environment:
PARAMS: '--spring.datasource.url=jdbc:mysql://IP:PORT/xxl_job?Unicode=true&characterEncoding=UTF-8 --spring.datasource.username=root --spring.datasource.password=123456'
ports:
- 80:7999
volumes:
- ./data/applogs:/data/applogs
启动后
访问地址为:IP/xxl-job-admin/ 账号:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏