從0搭建Java/Golang應用并接入
對于基于開源XXL-JOB自建任務調度系統的應用而言,可能會遇到任務配置復雜、任務執行效率低、監控和管理困難等需求。阿里云提供的開源解決方案,支持定時任務調度和任務分片等功能,幫助自建定時任務快速接入任務調度平臺。
前提條件
子賬號需添加XXLJOB對應RAM權限配置。具體信息,請參見任務調度XXLJOB版授權。
創建XXLJOB實例。具體操作,請參見創建實例。
方案概覽
本方案將從零開始,使用Java語言,手把手教您搭建一個XXL-JOB定時任務,構建Docker鏡像并上傳至阿里云鏡像倉庫,然后將其接入到分布式任務調度平臺XXL-JOB,進行單機和分片廣播的定時任務測試,幫助您全面了解和掌握XXL-JOB的使用與配置。大致分為以下幾步:
創建應用:通過創建應用對定時任務進行統一管理,方便查看、配置和調度,提升管理效率。
開發及部署應用:編寫定時任務代碼,構建Docker鏡像,并將鏡像上傳至阿里云鏡像倉庫,實現應用的容器化管理和部署。
測試驗證:確保已接入的應用能夠在XXLJOB平臺上正常自動化調度和管理,任務能夠按計劃準時準確執行。
步驟一:創建應用
登錄XXL-JOB控制臺,并在頂部菜單欄選擇地域。
單擊目標實例,進入實例詳情頁,在左側導航欄,選擇
,單擊創建應用。填寫AppName和名稱,使用系統自動生成的AccessToken,單擊確定。
步驟二:開發及部署應用
1.開發XXL-JOB任務
分布式任務調度XXL-JOB版支持Java應用和Go應用接入。如果您想了解更多信息,您可參考開源XXL-JOB的demo工程:
Go版本:xxl-job-executor-go。
Java
環境配置:在您的pom.xml中引入
xxl-job-core
的maven依賴。具體版本,參考xxl-job-executor-sample-springboot。<!-- xxl-job-core --> <dependency> <groupId>com.xuxueli</groupId> <artifactId>xxl-job-core</artifactId> <version>2.2.x</version> </dependency>
初始化執行器。
@Configuration 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.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; } }
編寫任務執行代碼,以2.2.x為例。
說明XXLJOB不同版本接口不同,具體請參考開源demo工程。
@Component public class SampleXxlJob { private static Logger logger = LoggerFactory.getLogger(SampleXxlJob.class); @XxlJob("helloworld") public ReturnT<String> helloworld(String param) throws Exception { XxlJobLogger.log("XXL-JOB, Hello World, start..."); for (int i = 0; i < 5; i++) { XxlJobLogger.log("beat at:" + i); TimeUnit.SECONDS.sleep(2); } System.out.println("XXL-JOB, Hello World, finished"); return ReturnT.SUCCESS; } }
Golang
環境配置:執行以下命令,使用最新的tag拉取Go版本的XXL-JOB的SDK。
go get github.com/xxl-job/xxl-job-executor-go@{最新的tag}
編寫任務執行代碼。
package main import ( "context" "fmt" xxl "github.com/xxl-job/xxl-job-executor-go" "github.com/xxl-job/xxl-job-executor-go/example/task" "log" ) func main() { exec := xxl.NewExecutor( xxl.ServerAddr("xxxxxx"), //請求地址,控制臺應用管理接入配置獲取 xxl.AccessToken("xxxxxxx"), //請求令牌,控制臺應用管理接入配置獲取 xxl.ExecutorPort("9999"), //默認9999(非必填) xxl.RegistryKey("golang-jobs"), //執行器名稱 xxl.SetLogger(&logger{}), //自定義日志 ) exec.Init() exec.Use(customMiddleware) //設置日志查看handler exec.LogHandler(customLogHandle) //注冊任務handler exec.RegTask("task.test", task.Test) exec.RegTask("task.test2", task.Test2) exec.RegTask("task.panic", task.Panic) log.Fatal(exec.Run()) } // 自定義日志處理器 func customLogHandle(req *xxl.LogReq) *xxl.LogRes { return &xxl.LogRes{Code: xxl.SuccessCode, Msg: "", Content: xxl.LogResContent{ FromLineNum: req.FromLineNum, ToLineNum: 2, LogContent: "這個是自定義日志handler", IsEnd: true, }} } // xxl.Logger接口實現 type logger struct{} func (l *logger) Info(format string, a ...interface{}) { fmt.Println(fmt.Sprintf("自定義日志 - "+format, a...)) } func (l *logger) Error(format string, a ...interface{}) { log.Println(fmt.Sprintf("自定義日志 - "+format, a...)) } // 自定義中間件 func customMiddleware(tf xxl.TaskFunc) xxl.TaskFunc { return func(cxt context.Context, param *xxl.RunReq) string { log.Println("I am a middleware start") res := tf(cxt, param) log.Println("I am a middleware end") return res } }
2.部署應用至阿里云
阿里云XXL-JOB版僅支持阿里云網絡,需要將您的應用部署到阿里云上,以下以Java應用部署到容器服務為例進行說明。
容器服務集群需要和任務調度XXLJOB集群在同一個VPC內。
在SpringBoot應用的根目錄下編寫Dockerfile文件。
# 下面替換你自己的基礎鏡像 FROM reg.docker.alibaba-inc.com/xxx/xxxx-java:1.0-beta MAINTAINER xueren ENV JAVA_OPTS="" ADD target/xxl-job-executor-sample-springboot-*.jar /app.jar ENTRYPOINT ["sh","-c","java -jar $JAVA_OPTS /app.jar]
使用Docker工具,構建Docker鏡像,并上傳到阿里云鏡像倉庫。
docker login --username=xxx@aliyun.com registry.cn-hangzhou.aliyuncs.com --password=xxxxxx docker buildx build --platform linux/amd64 -t registry.cn-hangzhou.aliyuncs.com/schedulerx/xxljob-demo:2.2.0 . docker push registry.cn-hangzhou.aliyuncs.com/schedulerx/xxljob-demo:2.2.0
在左側導航欄的
頁面,單擊目標應用操作列的接入配置。登錄阿里云容器服務,進入目標集群,單擊使用Yaml創建資源,創建Deployment。以接入方式2(通過-D參數重啟應用)的為例進行接入配置,替換YAML的JAVA_OPTS列中,實現環境變量注入JVM參數。
apiVersion: apps/v1 kind: Deployment metadata: name: xxljob-xueren-test labels: app: xxljob-xueren-test spec: replicas: 2 selector: matchLabels: app: xxljob-xueren-test template: metadata: labels: app: xxljob-xueren-test spec: containers: - name: xxljob-executor image: registry.cn-hangzhou.aliyuncs.com/schedulerx/xxljob-demo:2.2.0 ports: - containerPort: 9999 env: - name: JAVA_OPTS value: >- -Dxxl.job.admin.addresses=http://xxljob-xxxxx.schedulerx.mse.aliyuncs.com -Dxxl.job.executor.appname=xueren_test -Dxxl.job.accessToken=xxxxxxx
步驟三:測試驗證
1.執行器接入驗證
進入目標實例詳情頁,單擊左側導航欄的應用管理,在應用列表頁面,單擊目標應用的執行器數量,可看到接入的執行器地址和在線狀態。
2.任務測試驗證
單機任務測試
單機任務表示每次執行在該應用下的所有執行器中按照路由策略選一臺冪等執行。
在左側導航欄,選擇任務管理,單擊創建任務。首先進行基本配置,填寫任務名稱和jobHandler名稱,關聯應用選擇目標應用,路由策略選擇輪詢,然后單擊下一步。
進行定時配置,時間類型選擇cron,通過單擊使用生成工具按鈕,生成cron表達式。本示例以每天12時執行一次為例,然后單擊下一步。
進行通知配置,您可以在此配置超時報警、成功通知、失敗報警、通知方式、通知對象。本示例以控制臺默認配置為例。
創建完成后,單擊目標任務操作列中的運行一次,在手動執行任務彈框中,指定機器,配置實例參數,單擊確定
單擊
,查看任務執行記錄。單擊左側導航欄執行列表,單擊目標執行記錄操作列中的日志,查看本次任務的執行日志記錄。
分片廣播任務測試
廣播分片表示每次執行會廣播該應用下所有執行器執行,每個執行器能拿到不同的分片號,可以用來做分布式批處理。開源XXLJOB分片廣播無聚合功能,阿里云XXLJOB可以聚合展示每次執行的所有分片情況。
在左側導航欄,選擇任務管理,單擊創建任務。首先進行基本配置,填寫任務名稱和jobHandler名稱,關聯應用選擇目標應用,路由策略選擇分片廣播。然后單擊下一步。
進行定時配置,時間類型選擇cron,通過單擊使用生成工具按鈕,生成cron表達式。本示例以每小時第10分執行一次為例,然后單擊下一步。
進行通知配置,您可以在此配置設置超時報警、成功通知、失敗報警、通知方式、通知對象。本示例以控制臺默認配置為例。
創建完成后,單擊目標任務操作列中的運行一次,在手動執行任務彈框中,指定機器,配置實例參數,單擊確定。
單擊
,查看任務執行記錄。單擊左側導航欄的執行列表,在任務執行列表頁,單擊目標任務執行操作列中的詳情,在分片詳情中可聚合展示每臺機器的執行情況。
針對每個分片,單擊指定分片操作列中的日志,查看本次任務的執行日志記錄。