亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁技術(shù)文章
文章詳情頁

SpringBoot整合Xxl-Job的完整步驟記錄

瀏覽:75日期:2023-04-07 11:57:16

一、下載Xxl-Job源代碼并導入本地并運行

Github地址:https://github.com/xuxueli/xxl-job

中文文檔地址:https://www.xuxueli.com/xxl-job/

1.使用Idea或Eclipse導入

2.執(zhí)行sql腳本(紅色標記處)

SpringBoot整合Xxl-Job的完整步驟記錄

3.運行xxl-job-admin(xxl-job后臺管理,主要方便管理各種各樣的任務(wù))

注意:在運行之前,需要把2的sql腳本執(zhí)行完畢,并修改數(shù)據(jù)庫連接池。

正常啟動,訪問地址為:http://localhost:8080/xxl-job-admin

效果圖,如下所示:

SpringBoot整合Xxl-Job的完整步驟記錄

用戶名默認為admin

密碼為123456

輸入后,進入這個界面,如圖:

SpringBoot整合Xxl-Job的完整步驟記錄

這樣就表示Xxl-Job成功運行了。確保運行沒問題后,就可以開始下一步。

二、添加執(zhí)行器(Xxl-Job源代碼就一個Example,可以復用過來,你也可以選擇自己新建項目,新建項目可以在Xxl-Job基礎(chǔ)上,也可以放在其它項目中)

1.新建一個Maven項目,命名為blog-xxl-job。

2.導入Maven依賴

<!-- https://mvnrepository.com/artifact/com.xuxueli/xxl-job-core --> <dependency> <groupId>com.xuxueli</groupId> <artifactId>xxl-job-core</artifactId> <version>2.2.0</version> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>

3.新建application.yml配置文件并添加如下內(nèi)容

#eurekaeureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/# web portserver.port=8081# no web#spring.main.web-environment=false# log configlogging.config=classpath:logback.xml### xxl-job admin address list, such as 'http://address' or 'http://address01,http://address02'xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin### xxl-job, access tokenxxl.job.accessToken=### xxl-job executor appnamexxl.job.executor.appname=blog-xxl-job-executor### xxl-job executor registry-address: default use address to registry , otherwise use ip:port if address is nullxxl.job.executor.address=### xxl-job executor server-infoxxl.job.executor.ip=xxl.job.executor.port=9999### xxl-job executor log-pathxxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler### xxl-job executor log-retention-daysxxl.job.executor.logretentiondays=30

可以不用eureka,這里我的項目中用到eureka所以增加該配置。

增加logback.xml配置:

<?xml version='1.0' encoding='UTF-8'?><configuration debug='false' scan='true' scanPeriod='1 seconds'> <contextName>logback</contextName> <property name='log.path' value='/data/applogs/xxl-job/xxl-job-executor-sample-springboot.log'/> <appender name='console' class='ch.qos.logback.core.ConsoleAppender'> <encoder> <pattern>%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <appender name='file' class='ch.qos.logback.core.rolling.RollingFileAppender'> <file>${log.path}</file> <rollingPolicy class='ch.qos.logback.core.rolling.TimeBasedRollingPolicy'> <fileNamePattern>${log.path}.%d{yyyy-MM-dd}.zip</fileNamePattern> </rollingPolicy> <encoder> <pattern>%date %level [%thread] %logger{36} [%file : %line] %msg%n </pattern> </encoder> </appender> <root level='info'> <appender-ref ref='console'/> <appender-ref ref='file'/> </root></configuration>

4.編寫Application類

package com.springcloud.blog.job.execute;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.cloud.client.discovery.EnableDiscoveryClient;import org.springframework.cloud.netflix.eureka.EnableEurekaClient;@EnableEurekaClient@EnableDiscoveryClient@SpringBootApplicationpublic class BlogXxlJobExecutorApplication { public static void main(String[] args) { SpringApplication.run(BlogXxlJobExecutorApplication.class, args); }}

5.編寫Job執(zhí)行器

package com.springcloud.blog.job.execute.jobhandler;import com.xxl.job.core.biz.model.ReturnT;import com.xxl.job.core.handler.IJobHandler;import com.xxl.job.core.handler.annotation.XxlJob;import com.xxl.job.core.log.XxlJobLogger;import com.xxl.job.core.util.ShardingUtil;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.stereotype.Component;import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.DataOutputStream;import java.io.InputStreamReader;import java.net.HttpURLConnection;import java.net.URL;import java.util.Arrays;import java.util.concurrent.TimeUnit;/** * XxlJob開發(fā)示例(Bean模式) * <p> * 開發(fā)步驟: * 1、在Spring Bean實例中,開發(fā)Job方法,方式格式要求為 'public ReturnT<String> execute(String param)' * 2、為Job方法添加注解 '@XxlJob(value='自定義jobhandler名稱', init = 'JobHandler初始化方法', destroy = 'JobHandler銷毀方法')',注解value值對應(yīng)的是調(diào)度中心新建任務(wù)的JobHandler屬性的值。 * 3、執(zhí)行日志:需要通過 'XxlJobLogger.log' 打印執(zhí)行日志; * * @author xuxueli 2019-12-11 21:52:51 */@Componentpublic class SampleXxlJob { private static Logger logger = LoggerFactory.getLogger(SampleXxlJob.class); /** * 1、簡單任務(wù)示例(Bean模式) */ @XxlJob('demoJobHandler') public ReturnT<String> demoJobHandler(String param) throws Exception { XxlJobLogger.log('XXL-JOB, Hello World.'); for (int i = 0; i < 5; i++) { XxlJobLogger.log('beat at:' + i); TimeUnit.SECONDS.sleep(2); } return ReturnT.SUCCESS; } /** * 2、分片廣播任務(wù) */ @XxlJob('shardingJobHandler') public ReturnT<String> shardingJobHandler(String param) throws Exception { // 分片參數(shù) ShardingUtil.ShardingVO shardingVO = ShardingUtil.getShardingVo(); XxlJobLogger.log('分片參數(shù):當前分片序號 = {}, 總分片數(shù) = {}', shardingVO.getIndex(), shardingVO.getTotal()); // 業(yè)務(wù)邏輯 for (int i = 0; i < shardingVO.getTotal(); i++) { if (i == shardingVO.getIndex()) { XxlJobLogger.log('第 {} 片, 命中分片開始處理', i); } else { XxlJobLogger.log('第 {} 片, 忽略', i); } } return ReturnT.SUCCESS; } /** * 3、命令行任務(wù) */ @XxlJob('commandJobHandler') public ReturnT<String> commandJobHandler(String param) throws Exception { String command = param; int exitValue = -1; BufferedReader bufferedReader = null; try { // command process Process process = Runtime.getRuntime().exec(command); BufferedInputStream bufferedInputStream = new BufferedInputStream(process.getInputStream()); bufferedReader = new BufferedReader(new InputStreamReader(bufferedInputStream)); // command log String line; while ((line = bufferedReader.readLine()) != null) { XxlJobLogger.log(line); } // command exit process.waitFor(); exitValue = process.exitValue(); } catch (Exception e) { XxlJobLogger.log(e); } finally { if (bufferedReader != null) { bufferedReader.close(); } } if (exitValue == 0) { return IJobHandler.SUCCESS; } else { return new ReturnT<String>(IJobHandler.FAIL.getCode(), 'command exit value(' + exitValue + ') is failed'); } } /** * 4、跨平臺Http任務(wù) * 參數(shù)示例: * 'url: http://www.baidu.comn' + * 'method: getn' + * 'data: contentn'; */ @XxlJob('httpJobHandler') public ReturnT<String> httpJobHandler(String param) throws Exception { // param parse if (param == null || param.trim().length() == 0) { XxlJobLogger.log('param[' + param + '] invalid.'); return ReturnT.FAIL; } String[] httpParams = param.split('n'); String url = null; String method = null; String data = null; for (String httpParam : httpParams) { if (httpParam.startsWith('url:')) { url = httpParam.substring(httpParam.indexOf('url:') + 4).trim(); } if (httpParam.startsWith('method:')) { method = httpParam.substring(httpParam.indexOf('method:') + 7).trim().toUpperCase(); } if (httpParam.startsWith('data:')) { data = httpParam.substring(httpParam.indexOf('data:') + 5).trim(); } } // param valid if (url == null || url.trim().length() == 0) { XxlJobLogger.log('url[' + url + '] invalid.'); return ReturnT.FAIL; } if (method == null || !Arrays.asList('GET', 'POST').contains(method)) { XxlJobLogger.log('method[' + method + '] invalid.'); return ReturnT.FAIL; } // request HttpURLConnection connection = null; BufferedReader bufferedReader = null; try { // connection URL realUrl = new URL(url); connection = (HttpURLConnection) realUrl.openConnection(); // connection setting connection.setRequestMethod(method); connection.setDoOutput(true); connection.setDoInput(true); connection.setUseCaches(false); connection.setReadTimeout(5 * 1000); connection.setConnectTimeout(3 * 1000); connection.setRequestProperty('connection', 'Keep-Alive'); connection.setRequestProperty('Content-Type', 'application/json;charset=UTF-8'); connection.setRequestProperty('Accept-Charset', 'application/json;charset=UTF-8'); // do connection connection.connect(); // data if (data != null && data.trim().length() > 0) { DataOutputStream dataOutputStream = new DataOutputStream(connection.getOutputStream()); dataOutputStream.write(data.getBytes('UTF-8')); dataOutputStream.flush(); dataOutputStream.close(); } // valid StatusCode int statusCode = connection.getResponseCode(); if (statusCode != 200) { throw new RuntimeException('Http Request StatusCode(' + statusCode + ') Invalid.'); } // result bufferedReader = new BufferedReader(new InputStreamReader(connection.getInputStream(), 'UTF-8')); StringBuilder result = new StringBuilder(); String line; while ((line = bufferedReader.readLine()) != null) { result.append(line); } String responseMsg = result.toString(); XxlJobLogger.log(responseMsg); return ReturnT.SUCCESS; } catch (Exception e) { XxlJobLogger.log(e); return ReturnT.FAIL; } finally { try { if (bufferedReader != null) { bufferedReader.close(); } if (connection != null) { connection.disconnect(); } } catch (Exception e2) { XxlJobLogger.log(e2); } } } /** * 5、生命周期任務(wù)示例:任務(wù)初始化與銷毀時,支持自定義相關(guān)邏輯; */ @XxlJob(value = 'demoJobHandler2', init = 'init', destroy = 'destroy') public ReturnT<String> demoJobHandler2(String param) throws Exception { XxlJobLogger.log('XXL-JOB, Hello World.'); return ReturnT.SUCCESS; } public void init() { logger.info('init'); } public void destroy() { logger.info('destory'); }}

6.增加XxlJobConfig配置類

package com.springcloud.blog.job.execute.core.config;import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.factory.annotation.Value;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;@Configurationpublic 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; }}

三、結(jié)合Xxl-Job后臺系統(tǒng)增加定時任務(wù)

1.配置執(zhí)行器

SpringBoot整合Xxl-Job的完整步驟記錄

執(zhí)行器地址為(與blog-xxl-job中application.yml配置文件里的執(zhí)行器地址需要保持一致,否則會注冊失敗,導致任務(wù)執(zhí)行不了:

SpringBoot整合Xxl-Job的完整步驟記錄

2.添加任務(wù)

SpringBoot整合Xxl-Job的完整步驟記錄

3.任務(wù)執(zhí)行成功的標志

SpringBoot整合Xxl-Job的完整步驟記錄

四、為什么選擇Xxl-Job

當初選擇使用Xxl-Job有這么幾個原因:

第一、團隊里有好幾個人上一家公司或上上家公司用過。

第二、這個生態(tài)比較豐富且開源。

第三、確實非常容易上手且輕量化(輕量化的一個體現(xiàn)就是非侵入式)

到此這篇關(guān)于SpringBoot整合Xxl-Job的文章就介紹到這了,更多相關(guān)SpringBoot整合Xxl-Job內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標簽: Spring
相關(guān)文章:
主站蜘蛛池模板: 亚洲欧洲日本精品 | 日本黄色影片在线观看 | yiren22亚洲综合高清一区 | 久久99中文字幕伊人 | 91三级| 国产孕妇做受视频在线观看 | 99久热在线精品视频观看 | 成人午夜免费视频免费看 | 欧美黄网站 | 精品一区二区三区影片 | 精品一区二区三区在线视频观看 | 香蕉视频网站免费观视频 | 成年大片免费播放视频人 | 欧美亚洲一二三区 | 欧美日韩一区二区三区四区 | 中文字幕在线视频播放 | 中文字幕一区二区三区精彩视频 | 最新露脸国产精品视频 | 国内精品久久久久久久久 | 亚洲精品国产理论电影网 | 免费视频精品一区二区三区 | 亚洲国产欧美自拍 | 深夜精品影院18以下勿进 | 97视频免费看 | 91视频网址入口 | 欧美性色黄大片a级毛片视频 | 国产在线麻豆精品 | 狠狠狠色丁香婷婷综合久久五月 | 欧美日韩视频一区二区 | 96精品视频 | 久久免费视频7 | 久久婷婷激情综合色综合也去 | 91短视频在线高清hd | 在线高清免费爱做网 | 男人影院在线观看 | 久久亚洲综合色 | 国产 欧美 日本 | 中文字幕日韩一区二区三区不卡 | 精品国产午夜久久久久九九 | 我要看欧美一级毛片 | 美女视频一区二区 |