成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

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

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

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

一、下載Xxl-Job源代碼并導(dǎo)入本地并運(yùn)行

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

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

1.使用Idea或Eclipse導(dǎo)入

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

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

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

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

正常啟動(dòng),訪問地址為:http://localhost:8080/xxl-job-admin

效果圖,如下所示:

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

用戶名默認(rèn)為admin

密碼為123456

輸入后,進(jìn)入這個(gè)界面,如圖:

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

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

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

1.新建一個(gè)Maven項(xiàng)目,命名為blog-xxl-job。

2.導(dǎo)入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,這里我的項(xiàng)目中用到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實(shí)例中,開發(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ù):當(dāng)前分片序號(hào) = {}, 總分片數(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、跨平臺(tái)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ù)初始化與銷毀時(shí),支持自定義相關(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ái)系統(tǒng)增加定時(shí)任務(wù)

1.配置執(zhí)行器

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

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

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

2.添加任務(wù)

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

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

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

四、為什么選擇Xxl-Job

當(dāng)初選擇使用Xxl-Job有這么幾個(gè)原因:

第一、團(tuán)隊(duì)里有好幾個(gè)人上一家公司或上上家公司用過。

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

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

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

標(biāo)簽: Spring
相關(guān)文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
这里是久久伊人| 久久久久99精品一区| 精品久久久久久亚洲综合网| 蜜桃av一区二区三区| 国产精品一区视频| 国产精品久线观看视频| 91丨九色丨黑人外教| 555夜色666亚洲国产免| 天堂在线亚洲视频| 国产视频一区三区| 亚洲激情五月婷婷| 在线日韩欧美| 国产精品国产a| 亚洲网址在线| 国产精品久久午夜夜伦鲁鲁| av日韩在线网站| 日韩天堂在线观看| 成人一区在线看| 日韩午夜激情av| www.欧美亚洲| 久久男人中文字幕资源站| 成人一级黄色片| 欧美一级日韩免费不卡| 国产一区二区不卡在线| 欧美日本在线播放| 国产一区二区不卡老阿姨| 欧美一区二区三区成人| 国产91丝袜在线播放九色| 日韩女优视频免费观看| av中文字幕在线不卡| 久久综合色一综合色88| 91社区在线播放| 久久久久久亚洲综合影院红桃 | 欧美成人精品二区三区99精品| 福利一区二区在线| 精品国产免费视频| 欧美极品一区二区三区| 亚洲手机成人高清视频| 亚洲尤物精选| 免费视频一区二区| 欧美一区二区视频观看视频| 成人av在线资源| 国产欧美精品一区二区色综合 | 国产成人精品一区二区三区四区| 日韩欧美的一区| 色综合天天综合在线视频| 国产精品视频免费看| 亚洲国产精品一区在线观看不卡 | 天堂蜜桃91精品| 欧美理论在线播放| 99久久免费视频.com| 中文字幕一区在线| 另类天堂av| 麻豆久久久久久| 欧美成人a在线| 欧美jizzhd精品欧美巨大免费| 国产精品不卡一区| 久久精品伊人| 国产在线视视频有精品| 久久亚洲二区三区| 国产日韩欧美一区在线| 视频一区二区不卡| 欧美一区二区福利视频| 欧美精品一区三区在线观看| 亚洲午夜电影网| 欧美老人xxxx18| 国产精品99免费看| 偷偷要91色婷婷| 91麻豆精品国产91久久久 | 欧美精品午夜| 亚洲成人一区二区| 日韩亚洲电影在线| 亚洲欧洲在线一区| 久久精品噜噜噜成人88aⅴ| 久久亚洲一区二区三区明星换脸| 亚洲毛片在线| 国产综合久久久久久鬼色 | 精品一区二区三区免费视频| 欧美成人福利视频| 亚洲精品影院在线观看| 麻豆成人免费电影| 欧美电视剧免费观看| 亚洲伦伦在线| 国产精品资源网| 亚洲欧美一区二区在线观看| 91福利区一区二区三区| 色综合天天在线| 日韩精品91亚洲二区在线观看| 亚洲精品一区二区三区影院| 亚久久调教视频| 国产成人自拍在线| 一个色综合网站| 91精品国产一区二区三区香蕉| 欧美日韩一区二区视频在线观看| 日产国产欧美视频一区精品| 久久精品一区四区| 一本久道中文字幕精品亚洲嫩| 99视频精品免费视频| 污片在线观看一区二区| 国产欧美日韩精品a在线观看| 久久久久se| 91麻豆国产自产在线观看| 丝袜诱惑制服诱惑色一区在线观看| 精品国产乱码久久久久久久| 快she精品国产999| 国内一区二区三区在线视频| 国产一区二区影院| 夜夜精品视频一区二区| 日韩欧美成人激情| 国产精品美女久久久| 9色porny自拍视频一区二区| 日韩福利电影在线| 国产精品久久久久久久午夜片 | 亚洲精品欧美激情| 精品日韩欧美一区二区| 玖玖在线精品| 欧美婷婷久久| 国产一区 二区 三区一级| 亚洲国产日韩a在线播放性色| 精品国产伦一区二区三区观看方式| 久久亚洲免费| 国模大胆一区二区三区| 国产成人在线色| 日韩不卡一区二区三区| 亚洲婷婷综合色高清在线| 欧美成人三级电影在线| 在线免费亚洲电影| 中文在线一区| 欧美日韩国产综合在线| 成人黄色在线网站| 国产综合色在线视频区| 石原莉奈在线亚洲三区| 亚洲欧美日韩在线| 久久精品一区二区三区不卡牛牛| 欧美精品v国产精品v日韩精品| 羞羞答答国产精品www一本 | 欧美高清不卡| 成人性生交大片免费| 麻豆成人91精品二区三区| 亚洲一区二三区| 成人免费小视频| 国产欧美精品国产国产专区| 精品久久久久久无| 欧美一级片在线| 在线看一区二区| 亚洲一区二区三区精品视频| 国模精品娜娜一二三区| 91网站在线播放| 成人综合婷婷国产精品久久 | 国精产品一区一区三区mba桃花| 天堂在线亚洲视频| 亚洲综合色婷婷| 国产精品日产欧美久久久久| 2020国产精品久久精品美国| 日韩一级欧美一级| 69堂国产成人免费视频| 欧日韩精品视频| 色综合久久88色综合天天| 国产精品一二| 亚洲激情午夜| 黄色在线一区| 欧美视频在线观看| 午夜精品网站| 91香蕉视频污在线| 91在线视频播放| 99久久er热在这里只有精品15| 国产91精品在线观看| 国产一二精品视频| 国产精品白丝av| 国产成人精品免费在线| 国产成人一区在线| 丁香婷婷综合五月| 成人永久免费视频| 成人精品视频一区二区三区尤物| 国产精品一区二区在线观看网站| 久久99热这里只有精品| 麻豆精品视频在线观看视频| 蜜臀a∨国产成人精品| 日韩经典一区二区| 日韩高清国产一区在线| 免费看精品久久片| 麻豆精品蜜桃视频网站| 久久99精品国产麻豆婷婷洗澡| 蜜桃视频一区二区三区在线观看| 日本不卡一区二区| 日本视频一区二区| 国产综合久久久久久鬼色 | 成人av免费网站| 91丝袜国产在线播放| 欧美成人综合| 欧美天天视频| 一本久久综合| 美玉足脚交一区二区三区图片| 久久激情一区| 欧美亚洲综合网| 欧美丰满少妇xxxxx高潮对白| 欧美一区二区精品在线| 精品av综合导航| 国产精品区一区二区三区| 亚洲精品第1页|