文章目录
- 前言
- 一、docker-compose 部署xxl-job
- 二、springboot项目中使用xxl
- 1.pom文件导包
- 2.添加配置文件
- 3添加java配置文件
- 3.添加任务
- 三、在xxl-job平台配置任务
- 1.新增执行器
- 1.新增任务
- 总结
前言
在本文中,我们将探讨如何:
- 使用Docker-Compose创建一个包含xxl-job和其所需依赖的Docker容器集群,使得部署变得轻松而可伸缩。
- 配置xxl-job以适应你的应用需求,包括任务的调度和执行。
- 创建和管理任务,以及监控任务的执行情况。
- 通过示例演示如何使用Docker-Compose和xxl-job来调度和管理任务,以便你可以将这一强大的组合应用于自己的项目中。
无论是对Docker、Spring Boot还是xxl-job不熟悉的读者,本文都将提供清晰的指导,帮助你一步步实现任务调度和管理的自动化,从而提高应用的可维护性和效率。让我们开始吧!
一、docker-compose 部署xxl-job
创建docker-compose文件
version: "3"
services:
xxl-job-admin:
restart: always
# docker 镜像
image: xuxueli/xxl-job-admin:2.4.0
# 容器名称
container_name: xxl-job-admin
volumes:
# 日志目录映射到主机目录
- ./data/logs:/data/applogs
ports:
# 端口映射
- "8800:8800"
environment:
# 设置启动参数
PARAMS: '
--server.port=8800
--server.servlet.context-path=/xxl-job-admin
--spring.datasource.url=jdbc:mysql://ip:3306/xxl-job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai
--spring.datasource.username=xxl-job
--spring.datasource.password=yKnam2mYb82Dpf6N
--spring.mail.username=xxxx.com
--spring.mail.password=xxxx
--xxl.job.accessToken=onelovehzs888' #代码里面需要指定的token
此处数据库可自行创建可参考官网xxl官网
在compose文件中修改数据库配置即可
–spring.mail.username=1958615756@qq.com
–spring.mail.password=Lsl18718383742
此处使xxl登录密码,可自行修改配置
运行compse文件看访问 http://你的服务器ip:8800/xxl-job-admin/
注意需要开发8800端口
登录可看到这个页面
二、springboot项目中使用xxl
1.pom文件导包
<!-- xxl-job-core -->
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>2.4.0</version>
</dependency>
2.添加配置文件
代码如下(示例):
xxl:
job:
accessToken: onelovehzs888
admin:
addresses: http://你的服务器ip:8800/xxl-job-admin
executor:
appname: xxl-job-executor-freelancer
address: http://你的服务器ip:8800/xxl-job-admin
ip: 你的服务器ip
port: 8800
logpath: ./xxl-job/executor
logretentiondays: 7
accessToken需要和compose文件的配置一样
appname为执行器名字,下面会配置
3添加java配置文件
@Configuration
public class XxlJobConfig {
private final 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() {
logger.info(">>>>>>>>>>> xxl-job config init.");
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;
}
/**
* 针对多网卡、容器内部署等情况,可借助 "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();
*/
}
3.添加任务
@Slf4j
@Component
public class TimedTaskJobHandler {
@Autowired(required = false)
private List<EveryMinuteExecute> everyMinuteExecutes;
@Autowired(required = false)
private List<EveryHourExecute> everyHourExecutes;
@Autowired(required = false)
private List<EveryDayExecute> everyDayExecutes;
/**
* 每分钟任务
*
* @throws Exception
*/
@XxlJob("everyMinuteExecute")
public ReturnT<String> everyMinuteExecute(String param) {
log.info("每分钟任务执行");
if (everyMinuteExecutes == null || everyMinuteExecutes.size() == 0) {
return ReturnT.SUCCESS;
}
for (int i = 0; i < everyMinuteExecutes.size(); i++) {
try {
everyMinuteExecutes.get(i).execute();
} catch (Exception e) {
log.error("每分钟任务异常", e);
}
}
return ReturnT.SUCCESS;
}
/**
* 每小时任务
*
* @throws Exception
*/
@XxlJob("everyHourExecuteJobHandler")
public ReturnT<String> everyHourExecuteJobHandler(String param) {
log.info("每小时任务执行");
if (everyHourExecutes == null || everyHourExecutes.size() == 0) {
return ReturnT.SUCCESS;
}
for (int i = 0; i < everyHourExecutes.size(); i++) {
try {
everyHourExecutes.get(i).execute();
} catch (Exception e) {
log.error("每小时任务异常", e);
}
}
return ReturnT.SUCCESS;
}
/**
* 每日任务
*
* @throws Exception
*/
@XxlJob("everyDayExecuteJobHandler")
public ReturnT<String> everyDayExecuteJobHandler(String param) {
log.info("每日任务执行");
if (everyDayExecutes == null || everyDayExecutes.size() == 0) {
return ReturnT.SUCCESS;
}
for (int i = 0; i < everyDayExecutes.size(); i++) {
try {
everyDayExecutes.get(i).execute();
} catch (Exception e) {
log.error("每日任务异常", e);
}
}
return ReturnT.SUCCESS;
}
}
此处推荐使用接口的形式,通过继承同类型接口实现任务的制定。
三、在xxl-job平台配置任务
1.新增执行器
在此处新增执行器,与springboot代码appname名称相同,选择自动注册即可;
1.新增任务
此处需要填写任务的cron表达式,不懂的可以网上工具直接生成;
jabHandler填写代码中注解@XxlJob对应的内容
然后点击操作运行即可
总结
完成了Docker-Compose部署并使用xxl-job(Spring Boot版)的整个过程后,你现在已经掌握了一个强大的工具组合,可以轻松管理和调度任务。这一解决方案不仅简化了任务的部署和管理,还提供了可扩展性和灵活性,使你能够更好地应对不断变化的应用需求。
现在,你可以将这些知识和技能应用于你自己的项目中,无论是构建数据处理管道、定时报表生成还是任何其他需要任务调度的应用场景。希望本文对你有所帮助,让你更好地理解和利用Docker-Compose和xxl-job来简化任务管理和提高生产力。
如果你有任何问题、反馈或需要进一步的帮助,都请随时联系我们。感谢你的阅读,祝愿你在任务调度和管理领域取得成功!