日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

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

瀏覽:216日期: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.執行sql腳本(紅色標記處)

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

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

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

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

效果圖,如下所示:

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

用戶名默認為admin

密碼為123456

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

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

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

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

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配置文件并添加如下內容

#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執行器

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開發示例(Bean模式) * <p> * 開發步驟: * 1、在Spring Bean實例中,開發Job方法,方式格式要求為 'public ReturnT<String> execute(String param)' * 2、為Job方法添加注解 '@XxlJob(value='自定義jobhandler名稱', init = 'JobHandler初始化方法', destroy = 'JobHandler銷毀方法')',注解value值對應的是調度中心新建任務的JobHandler屬性的值。 * 3、執行日志:需要通過 'XxlJobLogger.log' 打印執行日志; * * @author xuxueli 2019-12-11 21:52:51 */@Componentpublic class SampleXxlJob { private static Logger logger = LoggerFactory.getLogger(SampleXxlJob.class); /** * 1、簡單任務示例(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、分片廣播任務 */ @XxlJob('shardingJobHandler') public ReturnT<String> shardingJobHandler(String param) throws Exception { // 分片參數 ShardingUtil.ShardingVO shardingVO = ShardingUtil.getShardingVo(); XxlJobLogger.log('分片參數:當前分片序號 = {}, 總分片數 = {}', shardingVO.getIndex(), shardingVO.getTotal()); // 業務邏輯 for (int i = 0; i < shardingVO.getTotal(); i++) { if (i == shardingVO.getIndex()) { XxlJobLogger.log('第 {} 片, 命中分片開始處理', i); } else { XxlJobLogger.log('第 {} 片, 忽略', i); } } return ReturnT.SUCCESS; } /** * 3、命令行任務 */ @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任務 * 參數示例: * '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、生命周期任務示例:任務初始化與銷毀時,支持自定義相關邏輯; */ @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; }}

三、結合Xxl-Job后臺系統增加定時任務

1.配置執行器

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

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

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

2.添加任務

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

3.任務執行成功的標志

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

四、為什么選擇Xxl-Job

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

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

第二、這個生態比較豐富且開源。

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

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

標簽: Spring
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
亚洲午夜久久久久久尤物 | 亚洲高清毛片| 91日韩欧美| 久久久久九九精品影院| 国产精品日本一区二区三区在线| 日韩国产精品久久久久久亚洲| 日韩专区视频网站| 日韩三级精品| 国产精品一区亚洲| 精品香蕉视频| 肉色欧美久久久久久久免费看| 欧美xxxx中国| 久久久精品五月天| 秋霞影院一区二区三区| 夜鲁夜鲁夜鲁视频在线播放| 国产精选在线| 青青久久av| 1024精品一区二区三区| 免费成人网www| 亚洲在线成人| 亚洲精品在线二区| 国产乱码精品| 国产精品xx| 亚洲精品91| 日本一不卡视频| 国产精品久一| 亚洲深夜视频| 国内精品福利| 日本亚洲三级在线| 欧美日韩网址| 欧美精品不卡| 麻豆视频在线看| 在线精品视频在线观看高清| 亚洲欧洲av| 久久av超碰| 久久免费国产| 亚洲另类av| 国产精品黄色片| 天堂中文av在线资源库| 亚洲欧洲一区| 国产精品麻豆成人av电影艾秋| av在线资源| 亚洲一卡久久| 国产乱人伦丫前精品视频 | 亚洲久草在线| 国产一区二区三区四区二区| 激情综合自拍| 日韩av黄色在线| 日韩免费视频| 日韩在线一二三区| 国产精品magnet| 国产一区欧美| 国产日韩欧美三级| 久久久久99| 日韩av网站在线免费观看| 精品国产亚洲一区二区三区| 午夜国产一区二区| 国产一精品一av一免费爽爽| 久久久久久黄| 日本免费一区二区视频| 国产成人免费av一区二区午夜| 亚洲在线网站| 福利一区二区| 日韩精品中文字幕吗一区二区| 中文字幕在线官网| 视频一区日韩精品| 久久久一二三| 国产精品黄网站| 午夜在线精品| 蜜臀国产一区| 日韩二区在线观看| 激情自拍一区| 精品久久影院| 中文字幕av亚洲精品一部二部 | 久久97视频| 蜜臀精品一区二区三区在线观看 | 亚洲精品视频一二三区| 亚洲深夜视频| 欧美日韩中出| av成人国产| 久久91导航| 久久久国产精品网站| 亚洲欧美久久精品| 欧美一级精品| 国产成年精品| 国产精品久久久久久妇女| 噜噜噜躁狠狠躁狠狠精品视频 | 五月婷婷六月综合| 日韩啪啪电影网| 国产日韩精品视频一区二区三区| 先锋亚洲精品| 亚洲不卡av不卡一区二区| 国产精品啊v在线| 婷婷久久免费视频| 制服诱惑一区二区| 国产综合视频| 日韩欧美午夜| 国产成人免费精品| 欧美激情三区| 日本免费新一区视频| 综合激情视频| 免费人成网站在线观看欧美高清| 欧美久久精品一级c片| 中文一区一区三区高中清不卡免费| 国产极品一区| 国产亚洲一区二区三区啪| 亚洲人成高清| 狠狠色狠狠色综合日日tαg| 999国产精品视频| 97精品国产福利一区二区三区| 久久99视频| 国产精品日韩精品在线播放| 欧美精品中文字幕亚洲专区| 日本成人手机在线| 亚洲欧美日韩一区在线观看| 亚洲国产日韩欧美在线| 欧美 日韩 国产精品免费观看| 久久在线电影| 国产尤物精品| 午夜免费一区| 亚洲一区日韩在线| 亚洲综合不卡| 狠狠干综合网| 亚洲欧美视频一区二区三区| 丝袜国产日韩另类美女| 国产农村妇女精品一二区| 亚洲欧美日本视频在线观看| 爽好久久久欧美精品| 亚洲精品免费观看| 日韩在线视频一区二区三区| 97精品资源在线观看| 欧美日韩a区| 欧美激情日韩| 亚洲精品88| 在线日韩欧美| 每日更新成人在线视频| 中文字幕亚洲影视| 色8久久久久| 国产伦理久久久久久妇女| 毛片不卡一区二区| 91免费精品| 五月综合激情| 亚洲男人在线| 久久99影视| 亚洲日本网址| 在线亚洲一区| 久久精品超碰| 精品久久久亚洲| 久久精品青草| 免费在线观看日韩欧美| 奇米777国产一区国产二区| 国产福利亚洲| 日韩毛片视频| 亚洲色图网站| 国产欧美日韩在线一区二区| 国产精品主播在线观看| 久久久亚洲欧洲日产| 黄色在线网站噜噜噜| 欧美二区视频| 亚洲网址在线观看| 国产精品九九| 久久久久.com| 亚洲精品护士| 精品少妇一区| 尹人成人综合网| 欧美午夜网站| 精品亚洲美女网站| 亚洲精华国产欧美| 欧美日韩18| 日韩av首页| 亚久久调教视频| 黄色在线观看www| 免费不卡在线视频| 久久亚洲精品中文字幕| 欧美日韩国产一区二区三区不卡| 久久不射中文字幕| 久久99蜜桃| 欧美日韩国产综合网| 国产伦精品一区二区三区在线播放 | 三级欧美在线一区| 久久精品72免费观看| 日韩综合精品| 四虎精品一区二区免费| 97精品在线| 亚洲免费专区| 激情国产在线| 日韩中文字幕视频网| 亚洲永久av| 91亚洲精品在看在线观看高清| 久久久一二三| 麻豆传媒一区二区三区| 国产精品黄网站| 激情综合自拍| 国产免费av国片精品草莓男男| 136国产福利精品导航网址| 91精品国产一区二区在线观看| 日韩精品水蜜桃| 国产情侣久久| 国产在线不卡| 成人免费一区|