javascript
开源调度框架xxl-job集成SpringBatch详解
文章目錄
- 一、啟動xxl-job調度中心
- 二、配置部署執行器項目
- 1、maven依賴
- 2、執行器配置
- 3、執行器組件配置
- 4、springbatch調度任務開發
- 5、調度中心,新建執行器
- 6、調度中心,新建調度任務
寫在前面:
我是「境里婆娑」。我還是從前那個少年,沒有一絲絲改變,時間只不過是考驗,種在心中信念絲毫未減,眼前這個少年,還是最初那張臉,面前再多艱險不退卻。
寫博客的目的就是分享給大家一起學習交流,如果您對 Java感興趣,可以關注我,我們一起學習。
前言:springbatch它對任務調度方面沒有做出什么封裝,如何把任務的執行時間實現cron表達式的可配置化, 修改的時候并不需要修改配置文件, 重啟工程等等麻煩的事情, 網上查找各種資料知道 xxl-job 及當當網開源的elastic-job,這里我就介紹xxl-job與spring batch的集成使用。
一、啟動xxl-job調度中心
如何啟動xxl-job調度中心,其官方文檔已經寫的很詳細,在這里就不在重復介紹了。
啟動xxl-job調用中心傳送門:啟動調度中心詳細步驟
根據官網調度中心啟動完成界面如下:
二、配置部署執行器項目
執行器項目:spring-boot-springbatch (提供多種版本執行器供選擇,現以 springboot 版本為例,可直接使用,也可以參考其并將現有項目改造成執行器)
作用:負責接收“調度中心”的調度并執行;可直接部署執行器,也可以將執行器集成到現有業務項目中。
1、maven依賴
spring-boot-springbatch pom文件中引入“ xxl-job-core”的maven依賴;
<dependency><groupId>com.xuxueli</groupId><artifactId>xxl-job-core</artifactId><version>2.2.0</version></dependency>2、執行器配置
執行器配置,配置內容說明:
### 調度中心部署跟地址 [選填]:如調度中心集群部署存在多個地址則用逗號分隔。執行器將會使用該地址進行"執行器心跳注冊"和"任務結果回調";為空則關閉自動注冊; xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin ### 執行器通訊TOKEN [選填]:非空時啟用; xxl.job.accessToken= ### 執行器AppName [選填]:執行器心跳注冊分組依據;為空則關閉自動注冊 xxl.job.executor.appname=spring-boot-springbatch ### 執行器注冊 [選填]:優先使用該配置作為注冊地址,為空時使用內嵌服務 ”IP:PORT“ 作為注冊地址。從而更靈活的支持容器類型執行器動態IP和動態映射端口問題。 xxl.job.executor.address= ### 執行器IP [選填]:默認為空表示自動獲取IP,多網卡時可手動設置指定IP,該IP不會綁定Host僅作為通訊實用;地址信息用于 "執行器注冊" 和 "調度中心請求并觸發任務"; xxl.job.executor.ip= ### 執行器端口號 [選填]:小于等于0則自動獲取;默認端口為9999,單機部署多個執行器時,注意要配置不同執行器端口; xxl.job.executor.port=9999 ### 執行器運行日志文件存儲磁盤路徑 [選填] :需要對該路徑擁有讀寫權限;為空則使用默認路徑; xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler ### 執行器日志文件保存天數 [選填] : 過期日志自動清理, 限制值大于等于3時生效; 否則, 如-1, 關閉自動清理功能; xxl.job.executor.logretentiondays=303、執行器組件配置
執行器組件XxlJobConfig配置如下:
@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;@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);xxlJobSpringExecutor.setPort(port);xxlJobSpringExecutor.setAccessToken(accessToken);xxlJobSpringExecutor.setLogPath(logPath);xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);return xxlJobSpringExecutor;} }4、springbatch調度任務開發
基于BEAN模式(方法形式)
Bean模式任務,支持基于方法的開發方式,每個任務對應一個方法。
JobLauncherService配置如下
/*** @author shuliangzhao* @date 2020/12/12 19:17*/ @Service public class JobLauncherService {private static final Logger log = LoggerFactory.getLogger(JobLauncherService.class);@Autowiredprivate JobLauncher jobLauncher;public Map<String,Object> startJob(Job job, JobParameters jobParameters) throws Exception {Map<String,Object> resultMap = CollUtil.newHashMap();//計時StopWatch stopWatch = new StopWatch();stopWatch.start(job.getName());//執行任務JobExecution run = jobLauncher.run(job, jobParameters);//返回結果StringBuffer stringBuffer = new StringBuffer();Collection<StepExecution> stepExecutions = run.getStepExecutions();stepExecutions.forEach(stepExecution -> {stringBuffer.append("readCount:" + stepExecution.getCommitCount() + LogConstants.LOG_STR_COMMA);stringBuffer.append("filterCount:" + stepExecution.getFilterCount() + LogConstants.LOG_STR_COMMA);stringBuffer.append("commitCount:" + stepExecution.getCommitCount() + LogConstants.LOG_STR_COMMA);stringBuffer.append("writeCount:" + stepExecution.getWriteCount());});stopWatch.stop();ExitStatus exitStatus = run.getExitStatus();String returnStr = System.lineSeparator() +"resultCount: "+ stringBuffer.toString()+ System.lineSeparator() +"exitStatus: "+exitStatus+ System.lineSeparator()+ "timeInfo: "+stopWatch.prettyPrint();log.info(returnStr);resultMap.put(SyncConstants.STR_RETURN_RESULT,returnStr);resultMap.put(SyncConstants.STR_RETURN_EXITSTATUS,exitStatus);return resultMap;} }啟動job工具類配置:
/*** @author shuliangzhao* @date 2020/12/12 19:24*/ public class JobUtil {/*** 構建JobParameters* @return*/private static JobParameters makeJobParameters() {JobParameters jobParameters = new JobParametersBuilder().addLong("time",System.currentTimeMillis()).toJobParameters();return jobParameters;}public static ReturnT<String> runJob4Executor(String jobName, JobLauncherService jobLauncherService, Job job) throws Exception {XxlJobLogger.log("start sync "+jobName +" data");Map<String, Object> resultMap = jobLauncherService.startJob(job, makeJobParameters());String resultStr = (String)resultMap.get(SyncConstants.STR_RETURN_RESULT);XxlJobLogger.log("end sync "+jobName +" data, result: "+System.lineSeparator()+resultStr);ExitStatus exitStatus = (ExitStatus)resultMap.get(SyncConstants.STR_RETURN_EXITSTATUS);String exitCode = exitStatus.getExitCode();//若成功,返回SUCCESSif(ExitStatus.COMPLETED.getExitCode().equals(exitCode)){return IJobHandler.SUCCESS;}else{return IJobHandler.FAIL;}} }執行器開發PatternMatchJobHandler
1、任務開發:在Spring Bean實例中,開發Job方法;
2、注解配置:為Job方法添加注解 “@XxlJob(value=“自定義jobhandler名稱”, init = “JobHandler初始化方法”, destroy = “JobHandler銷毀方法”)”,注解value值對應的是調度中心新建任務的JobHandler屬性的值。
3、執行日志:需要通過 “XxlJobHelper.log” 打印執行日志;
4、任務結果:默認任務結果為 “成功” 狀態,不需要主動設置;如有訴求,比如設置任務結果為失敗,可以通過 “XxlJobHelper.handleFail/handleSuccess” 自主設置任務結果;
5、調度中心,新建執行器
6、調度中心,新建調度任務
對新建的任務進行參數配置,運行模式選擇“ BEAN模式”,JobHandler屬性填充任務注釋解“ @XxlJob ”中定義的值
點擊任務管理執行按鈕執行一次,就可以把SpringBatch任務調起來。在調度日志里面可以查看接口是否執行成功或失敗。
調度日志:
至此,我們開源調度框架xxl-job集成springbatch介紹完畢。
如果想更詳細查看以上所有代碼請移步到github:開源調度框架xxl-job集成springbatch
總結
以上是生活随笔為你收集整理的开源调度框架xxl-job集成SpringBatch详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 全网最详细SpringBatch读(Re
- 下一篇: 详细介绍注解@Configuration