手写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;@Beanpublic 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 componentsorg.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