手写SpringBoot项目所使用的xxl-job分布式任务调度平台的starter
要将上述代码抽离成一个独立的 Spring Boot Starter,您需要创建一个新的 Maven 项目,并按照以下步骤进行操作:
-
创建 Maven 项目:
- 使用 IDE 或命令行创建一个新的 Maven 项目,命名为
xxl-job-starter
(或自定义名称)。 - 设置项目的
groupId
(例如:com.example
)、artifactId
(例如:xxl-job-starter
)和version
。
- 使用 IDE 或命令行创建一个新的 Maven 项目,命名为
-
添加必要的依赖:
- 在
pom.xml
文件中添加 Spring Boot Starter、XXL-JOB 的依赖以及所需的其他库(如 Hutool)。
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>com.xxl.job</groupId> <artifactId>xxl-job-core</artifactId> <version>{latest_xxjob_version}</version> </dependency> <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>{latest_hutool_version}</version> </dependency> </dependencies>
替换
{latest_xxjob_version}
和{latest_hutool_version}
为相应库的最新版本。 - 在
-
创建XxlJobAutoConfiguration类:
- 在项目中创建一个名为
XxlJobAutoConfiguration
(或自定义名称)的 Java 类,实现与您提供的代码相似的功能。将注释解除并调整代码结构如下:
- 在项目中创建一个名为
/*
* Copyright (c) 2020, 2024, fpl1116.cn All rights reserved.
*
*/
package cn.fpl.xxljob.autoconfiguration;
import cn.fpl.xxljob.config.XxlJobConfig;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
/**
* <p>Project: page-starter-demo - PageXAutoConfiguration</p>
* <p>Powered by fpl1116 On 2024-02-19 16:18:07</p>
* <p>描述:<p>
*
* @author penglei
* @version 1.0
* @since 1.8
*/
@Configuration
@Import( {XxlJobConfig.class})
//cn.fpl.pagex.enbale = xxx
@ConditionalOnProperty(prefix = "cn.fpl.xxljob", value = "enable",havingValue="true",matchIfMissing=true)
public class XxlJobAutoConfiguration { //领头羊
}
- 创建XxlJobProperties类:
/*
* Copyright (c) 2020, 2024, fpl1116.cn All rights reserved.
*
*/
package cn.fpl.xxljob.properties;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
/**
* <p>Project: page-starter-demo - PageXProperties</p>
* <p>Powered by fpl1116 On 2024-02-19 16:19:05</p>
* <p>描述:<p>
*
* @author penglei
* @version 1.0
* @since 1.8
*/
@Data
@ConfigurationProperties(prefix = "cn.fpl.xxljob")
public class XxlJobProperties {
private boolean enable = true;
private String adminAddresses;
private String accessToken;
private String appname;
private String address;
private String ip;
private String logPath;
private Integer logRetentionDays;
}
- 创建XxlJobConfig类:
/*
* Copyright (c) 2020, 2024, fpl1116.cn All rights reserved.
*
*/
package cn.fpl.xxljob.config;
import cn.fpl.xxljob.properties.XxlJobProperties;
import cn.hutool.core.net.NetUtil;
import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
/**
* <p>Project: page-starter-demo - XxlJobConfig</p>
* <p>Powered by fpl1116 On 2024-04-16 14:12:56</p>
* <p>描述:<p>
*
* @author penglei
* @version 1.0
* @since 1.8
*/
@Import({XxlJobProperties.class})
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.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);
//通过hutool工具获取一个本机可用端口
int usableLocalPort = NetUtil.getUsableLocalPort();
xxlJobSpringExecutor.setPort(usableLocalPort);
xxlJobSpringExecutor.setAccessToken(accessToken);
xxlJobSpringExecutor.setLogPath(logPath);
xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);
return xxlJobSpringExecutor;
}
}
- 创建 starter 的 META-INF 文件夹及 spring.factories 文件:
- 在项目的
src/main/resources
目录下创建META-INF
文件夹。 - 在
META-INF
文件夹中创建spring.factories
文件,内容如下:
- 在项目的
# Auto-configure components
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
cn.fpl.xxljob.autoconfiguration.XxlJobAutoConfiguration
这样设置后,当其他项目引入您的 starter 时,XxlJobAutoConfiguration
类会自动被 Spring Boot 加载并应用配置。
- 打包发布 starter:
- 在完成上述步骤后,使用 IDE 或 Maven 命令行编译并打包项目(通常是生成 JAR 文件)或直接deploy发布项目到maven配置的私仓。
- 将生成的 JAR 文件上传至 Maven 私服或公共仓库,以便其他项目通过 Maven 依赖方式引入。
现在,其他 Spring Boot 项目只需在 pom.xml
中添加对您创建的 xxl-job-starter
的依赖,即可自动配置 XXL-JOB。记得在应用的 application.properties
或 application.yml
文件中设置对应的 XXL-JOB 配置属性。
8. application.properties配置内容:
# XXL-JOB 相关配置
# 安装xxl-job服务的ip和端口
xxl.job.admin.addresses=http://localhost:8080/xxl-job-admin
xxl.job.accessToken=my-access-token
xxl.job.executor.appname=my-app
xxl.job.executor.address=
xxl.job.executor.ip=127.0.0.1
xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler
xxl.job.executor.logretentiondays=30