在本文中,我們將指導您如何使用Spring Cloud來搭建一個基於XXL-JOB的任務調度平臺。XXL-JOB是一個輕量級分佈式任務調度框架,支持CRON表達式與依賴關係管理等功能,非常適合於複雜的任務調度場景。以下是詳細的搭建步驟:
1. 環境準備
確保您的開發環境中已經安裝了以下軟件或工具:
- JDK 8及以上版本(推薦使用OpenJDK)
- Maven 3以上版本
- Git
- Spring Boot 2.x及以上版本
- MySQL數據庫或其他兼容的數據庫系統
2. XXL-Job核心模塊拉取及配置
首先我們需要從GitHub上下載XXL-Job的核心模塊代碼:
git clone https://github.com/xuxueli/xxl-job.git
cd xxl-job/xxl-job-core
mvn clean package -Dmaven.test.skip=true
打包完成後會生成`target\classes`目錄下的`META-INF`子目錄,其中包含了一些必要的配置文件。
3. Spring Boot項目創建
使用Spring Initializr創建一個新的Spring Boot項目,或者直接下載[spring-boot-starter-parent](https://github.com/spring-projects/spring-boot/tree/master/spring-boot-project/spring-boot-starters)作爲項目的父 pom。
4. POM文件配置
在項目的POM文件中添加以下依賴項:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 引入MySQL驅動 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- 引入Redis客戶端 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- 引入RabbitMQ客戶端 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<!-- Xxl Job Scheduler依賴 -->
<dependency>
<groupId>io.github.xiaoxiong</groupId>
<artifactId>xxl-job-core</artifactId>
<version>[2.0,)</version>
</dependency>
同時需要設置一些插件和資源過濾規則:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<mainClass>com.example.Application</mainClass>
</configuration>
</plugin>
</plugins>
<resources>
<resource>
<directory>${basedir}/src/main/resources</directory>
<filtering>false</filtering>
<includes>
<include>**/*.properties</include>
<include>**/*.yml</include>
</includes>
</resource>
<resource>
<directory>${basedir}/xxl-job/xxl-job-core/target/classes/META-INF</directory>
<filtering>false</filtering>
<excludes>
<exclude>**/*.class</exclude>
</excludes>
</resource>
</resources>
</build>
5. 配置文件編寫
在`application.yaml`中添加如下內容:
server:
port: 9999 # 端口
# MySql配置
spring:
datasource:
url: jdbc:mysql://localhost:3306/xxl_job?characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true
username: root
password: <PASSWORD>
driver-class-name: com.mysql.cj.jdbc.Driver
# Redis配置
redis:
host: localhost
port: 6379
database: 0
# RabbitMQ配置
rabbitmq:
host: localhost
port: 5672
virtualHost: /
username: guest
password: <PASSWORD>
# Xxl Job Config配置
xxl:
job:
admin:
addresses: http://127.0.0.1:8080
accessToken: yourAccessTokenHere
executor:
appName: spring-cloud-demo
address: ip:port // 例如:127.0.0.1:9999
ip: ${spring.cloud.client.ipAddress}
logpath: /var/log/xxl-job/jobhandler
logretentiondays: 30
handlerThreads: 10
discardedTaskCheckInterval: 60000
請注意,上述配置中的`yourAccessTokenHere`需要替換爲實際的訪問令牌,可以從XXL-Job的管理界面獲取。
6. 啓動類修改
將`@SpringBootApplication`註解改爲`@EnableAutoConfiguration @ComponentScan(basePackages = “com.example”)`。這是因爲XXL-Job的某些組件可能會導致Spring Boot應用啓動失敗。
7. 控制器實現
創建一個簡單的控制器來實現任務的觸發邏輯,例如:
import io.github.extendbus.utils.XxlJobLogger;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
/**
* 示例任務處理控制器
*/
@Controller
public class DemoJobHandler {
private static final Logger log = LoggerFactory.getLogger(DemoJobHandler.class);
@Value("${xxl.job.executor.address}")
String executorAddress;
// 定時任務執行器
@RequestMapping(value = "/demo")
@ResponseBody
public String demo() throws Exception {
XxlJobLogger.info(log, "Start job execute [{}]...", System.currentTimeMillis());
// 模擬耗時操作
Thread.sleep(2000);
return "success!";
}
}
8. 註冊服務
如果您的應用程序部署在雲環境中,比如Kubernetes,那麼您可能還需要配置服務的發現機制,如Eureka或Consul。否則,如果您是在本地運行該應用,則無需此步驟。
9. 測試與部署
編譯並打包您的項目,然後將其部署到目標服務器上。確保所有依賴的服務都已正常工作,並且您的任務調度器可以正確地連接到它們。最後,通過調用API接口或使用XXL-Job的管理界面來創建新的調度任務。
通過遵循這些步驟,您可以成功地在Spring Cloud環境中搭建一個功能齊全的XXL-Job任務調度平臺。這個平臺可以幫助您輕鬆管理和調度分佈式的後臺任務,提高系統的穩定性和效率。