pom.xml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
ruoyi-admin/pom.xml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
ruoyi-admin/src/main/resources/application-dev.yml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
ruoyi-admin/src/main/resources/application-prod.yml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
ruoyi-extend/ruoyi-xxl-job-admin/pom.xml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
ruoyi-job/pom.xml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
ruoyi-job/src/main/java/com/ruoyi/job/config/XxlJobConfig.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
ruoyi-job/src/main/java/com/ruoyi/job/config/properties/XxlJobProperties.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
ruoyi-job/src/main/java/com/ruoyi/job/service/SampleService.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
pom.xml
@@ -209,6 +209,13 @@ <version>${lock4j.version}</version> </dependency> <!-- xxl-job-core --> <dependency> <groupId>com.xuxueli</groupId> <artifactId>xxl-job-core</artifactId> <version>${xxl-job-core-version}</version> </dependency> <dependency> <groupId>com.yomahub</groupId> <artifactId>tlog-spring-boot-configuration</artifactId> @@ -237,10 +244,23 @@ <version>${tlog.version}</version> </dependency> <dependency> <groupId>com.yomahub</groupId> <artifactId>tlog-xxl-job</artifactId> <version>${tlog.version}</version> </dependency> <!-- 宿¶ä»»å¡ @deprecated 3.5.0å é¤ è¿ç§»è³xxl-job --> <dependency> <groupId>com.ruoyi</groupId> <artifactId>ruoyi-quartz</artifactId> <version>${ruoyi-vue-plus.version}</version> </dependency> <!-- 宿¶ä»»å¡ --> <dependency> <groupId>com.ruoyi</groupId> <artifactId>ruoyi-job</artifactId> <version>${ruoyi-vue-plus.version}</version> </dependency> @@ -294,6 +314,7 @@ <module>ruoyi-framework</module> <module>ruoyi-system</module> <module>ruoyi-quartz</module> <module>ruoyi-job</module> <module>ruoyi-generator</module> <module>ruoyi-common</module> <module>ruoyi-demo</module> ruoyi-admin/pom.xml
@@ -49,6 +49,11 @@ <dependency> <groupId>com.ruoyi</groupId> <artifactId>ruoyi-job</artifactId> </dependency> <dependency> <groupId>com.ruoyi</groupId> <artifactId>ruoyi-oss</artifactId> </dependency> ruoyi-admin/src/main/resources/application-dev.yml
@@ -1,4 +1,41 @@ # æ°æ®æºé ç½® --- # çæ§é ç½® spring: boot: admin: # Spring Boot Admin Client 客æ·ç«¯çç¸å ³é ç½® client: # å¢å 客æ·ç«¯å¼å ³ enabled: true # 设置 Spring Boot Admin Server å°å url: http://localhost:9090/admin instance: prefer-ip: true # 注åå®ä¾æ¶ï¼ä¼å ä½¿ç¨ IP username: ruoyi password: 123456 --- # xxl-job é ç½® xxl: job: # è°åº¦ä¸å¿å°åï¼å¦è°åº¦ä¸å¿é群é¨ç½²åå¨å¤ä¸ªå°ååç¨éå·åéã admin-addresses: http://localhost:9100/xxl-job-admin # æ§è¡å¨é讯TOKENï¼é空æ¶å¯ç¨ access-token: xxl-job # æ§è¡å¨é ç½® executor: # æ§è¡å¨AppNameï¼æ§è¡å¨å¿è·³æ³¨ååç»ä¾æ®ï¼ä¸ºç©ºåå ³éèªå¨æ³¨å appname: xxl-job-executor # æ§è¡å¨ç«¯å£å· æ§è¡å¨ä»9101å¼å§å¾åå port: 9101 # æ§è¡å¨æ³¨åï¼é»è®¤IP:PORT address: # æ§è¡å¨IPï¼é»è®¤èªå¨è·åIP ip: # æ§è¡å¨è¿è¡æ¥å¿æä»¶åå¨ç£çè·¯å¾ logpath: ./logs/xxl-job # æ§è¡å¨æ¥å¿æä»¶ä¿å天æ°ï¼å¤§äº3çæ logretentiondays: 30 --- # æ°æ®æºé ç½® spring: datasource: type: com.alibaba.druid.pool.DruidDataSource @@ -179,17 +216,3 @@ # # è®¢é æ¨¡å¼ # subscriptionMode: "MASTER" --- # çæ§é ç½® spring: boot: admin: # Spring Boot Admin Client 客æ·ç«¯çç¸å ³é ç½® client: # å¢å 客æ·ç«¯å¼å ³ enabled: true # 设置 Spring Boot Admin Server å°å url: http://localhost:9090/admin instance: prefer-ip: true # 注åå®ä¾æ¶ï¼ä¼å ä½¿ç¨ IP username: ruoyi password: 123456 ruoyi-admin/src/main/resources/application-prod.yml
@@ -1,4 +1,41 @@ # æ°æ®æºé ç½® --- # çæ§é ç½® spring: boot: admin: # Spring Boot Admin Client 客æ·ç«¯çç¸å ³é ç½® client: # å¢å 客æ·ç«¯å¼å ³ enabled: true # 设置 Spring Boot Admin Server å°å url: http://172.30.0.90:9090/admin instance: prefer-ip: true # 注åå®ä¾æ¶ï¼ä¼å ä½¿ç¨ IP username: ruoyi password: 123456 --- # xxl-job é ç½® xxl: job: # è°åº¦ä¸å¿å°åï¼å¦è°åº¦ä¸å¿é群é¨ç½²åå¨å¤ä¸ªå°ååç¨éå·åéã admin-addresses: http://172.30.0.92:9100/xxl-job-admin # æ§è¡å¨é讯TOKENï¼é空æ¶å¯ç¨ access-token: xxl-job # æ§è¡å¨é ç½® executor: # æ§è¡å¨AppNameï¼æ§è¡å¨å¿è·³æ³¨ååç»ä¾æ®ï¼ä¸ºç©ºåå ³éèªå¨æ³¨å appname: xxl-job-executor # æ§è¡å¨ç«¯å£å· æ§è¡å¨ä»9101å¼å§å¾åå port: 9101 # æ§è¡å¨æ³¨åï¼é»è®¤IP:PORT address: # æ§è¡å¨IPï¼é»è®¤èªå¨è·åIP ip: # æ§è¡å¨è¿è¡æ¥å¿æä»¶åå¨ç£çè·¯å¾ logpath: ./logs/xxl-job # æ§è¡å¨æ¥å¿æä»¶ä¿å天æ°ï¼å¤§äº3çæ logretentiondays: 30 --- # æ°æ®æºé ç½® spring: datasource: type: com.alibaba.druid.pool.DruidDataSource @@ -178,18 +215,3 @@ # readMode: "SLAVE" # # è®¢é æ¨¡å¼ # subscriptionMode: "MASTER" --- # çæ§é ç½® spring: boot: admin: # Spring Boot Admin Client 客æ·ç«¯çç¸å ³é ç½® client: # å¢å 客æ·ç«¯å¼å ³ enabled: true # 设置 Spring Boot Admin Server å°å url: http://172.30.0.90:9090/admin instance: prefer-ip: true # 注åå®ä¾æ¶ï¼ä¼å ä½¿ç¨ IP username: ruoyi password: 123456 ruoyi-extend/ruoyi-xxl-job-admin/pom.xml
@@ -75,7 +75,6 @@ <dependency> <groupId>com.xuxueli</groupId> <artifactId>xxl-job-core</artifactId> <version>${xxl-job-core-version}</version> </dependency> </dependencies> ruoyi-job/pom.xml
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,39 @@ <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>ruoyi-vue-plus</artifactId> <groupId>com.ruoyi</groupId> <version>3.2.0</version> </parent> <modelVersion>4.0.0</modelVersion> <packaging>jar</packaging> <artifactId>ruoyi-job</artifactId> <description> ä»»å¡è°åº¦ </description> <dependencies> <!-- éç¨å·¥å ·--> <dependency> <groupId>com.ruoyi</groupId> <artifactId>ruoyi-common</artifactId> </dependency> <!-- xxl-job-core --> <dependency> <groupId>com.xuxueli</groupId> <artifactId>xxl-job-core</artifactId> </dependency> <dependency> <groupId>com.yomahub</groupId> <artifactId>tlog-xxl-job</artifactId> </dependency> </dependencies> </project> ruoyi-job/src/main/java/com/ruoyi/job/config/XxlJobConfig.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,44 @@ package com.ruoyi.job.config; import com.ruoyi.job.config.properties.XxlJobProperties; import com.xxl.job.core.executor.impl.XxlJobSpringExecutor; import com.yomahub.tlog.springboot.lifecircle.TLogXxljobEnhanceInit; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; /** * xxl-job config * * @author Lion Li */ @Slf4j @EnableConfigurationProperties(XxlJobProperties.class) @AllArgsConstructor public class XxlJobConfig { private final XxlJobProperties xxlJobProperties; @Bean public XxlJobSpringExecutor xxlJobExecutor() { log.info(">>>>>>>>>>> xxl-job config init."); XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor(); xxlJobSpringExecutor.setAdminAddresses(xxlJobProperties.getAdminAddresses()); xxlJobSpringExecutor.setAccessToken(xxlJobProperties.getAccessToken()); XxlJobProperties.Executor executor = xxlJobProperties.getExecutor(); xxlJobSpringExecutor.setAppname(executor.getAppname()); xxlJobSpringExecutor.setAddress(executor.getAddress()); xxlJobSpringExecutor.setIp(executor.getIp()); xxlJobSpringExecutor.setPort(executor.getPort()); xxlJobSpringExecutor.setLogPath(executor.getLogPath()); xxlJobSpringExecutor.setLogRetentionDays(executor.getLogRetentionDays()); return xxlJobSpringExecutor; } @Bean public TLogXxljobEnhanceInit tLogXxljobEnhanceInit(){ return new TLogXxljobEnhanceInit(); } } ruoyi-job/src/main/java/com/ruoyi/job/config/properties/XxlJobProperties.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,38 @@ package com.ruoyi.job.config.properties; import lombok.Data; import lombok.NoArgsConstructor; import org.springframework.boot.context.properties.ConfigurationProperties; /** * xxljobé 置类 * * @author Lion Li */ @Data @ConfigurationProperties(prefix = "xxl.job") public class XxlJobProperties { private String adminAddresses; private String accessToken; private Executor executor; @Data @NoArgsConstructor public static class Executor { private String appname; private String address; private String ip; private int port; private String logPath; private int logRetentionDays; } } ruoyi-job/src/main/java/com/ruoyi/job/service/SampleService.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,254 @@ package com.ruoyi.job.service; import com.xxl.job.core.context.XxlJobHelper; import com.xxl.job.core.handler.annotation.XxlJob; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; 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æ¹æ³ï¼ * 2ãæ³¨è§£é ç½®ï¼ä¸ºJobæ¹æ³æ·»å 注解 "@XxlJob(value="èªå®ä¹jobhandleråç§°", init = "JobHandleråå§åæ¹æ³", destroy = "JobHandleréæ¯æ¹æ³")"ï¼æ³¨è§£valueå¼å¯¹åºçæ¯è°åº¦ä¸å¿æ°å»ºä»»å¡çJobHandler屿§çå¼ã * 3ãæ§è¡æ¥å¿ï¼éè¦éè¿ "XxlJobHelper.log" æå°æ§è¡æ¥å¿ï¼ * 4ãä»»å¡ç»æï¼é»è®¤ä»»å¡ç»æä¸º "æå" ç¶æï¼ä¸éè¦ä¸»å¨è®¾ç½®ï¼å¦æè¯æ±ï¼æ¯å¦è®¾ç½®ä»»å¡ç»æä¸ºå¤±è´¥ï¼å¯ä»¥éè¿ "XxlJobHelper.handleFail/handleSuccess" èªä¸»è®¾ç½®ä»»å¡ç»æï¼ * * @author xuxueli 2019-12-11 21:52:51 */ @Slf4j @Service public class SampleService { /** * 1ãç®åä»»å¡ç¤ºä¾ï¼Bean模å¼ï¼ */ @XxlJob("demoJobHandler") public void demoJobHandler() throws Exception { XxlJobHelper.log("XXL-JOB, Hello World."); for (int i = 0; i < 5; i++) { XxlJobHelper.log("beat at:" + i); TimeUnit.SECONDS.sleep(2); } // default success } /** * 2ãåç广æä»»å¡ */ @XxlJob("shardingJobHandler") public void shardingJobHandler() throws Exception { // åçåæ° int shardIndex = XxlJobHelper.getShardIndex(); int shardTotal = XxlJobHelper.getShardTotal(); XxlJobHelper.log("åçåæ°ï¼å½ååçåºå· = {}, æ»åçæ° = {}", shardIndex, shardTotal); // ä¸å¡é»è¾ for (int i = 0; i < shardTotal; i++) { if (i == shardIndex) { XxlJobHelper.log("第 {} ç, å½ä¸åçå¼å§å¤ç", i); } else { XxlJobHelper.log("第 {} ç, 忽ç¥", i); } } } /** * 3ãå½ä»¤è¡ä»»å¡ */ @XxlJob("commandJobHandler") public void commandJobHandler() throws Exception { String command = XxlJobHelper.getJobParam(); int exitValue = -1; BufferedReader bufferedReader = null; try { // command process ProcessBuilder processBuilder = new ProcessBuilder(); processBuilder.command(command); processBuilder.redirectErrorStream(true); Process process = processBuilder.start(); //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) { XxlJobHelper.log(line); } // command exit process.waitFor(); exitValue = process.exitValue(); } catch (Exception e) { XxlJobHelper.log(e); } finally { if (bufferedReader != null) { bufferedReader.close(); } } if (exitValue == 0) { // default success } else { XxlJobHelper.handleFail("command exit value(" + exitValue + ") is failed"); } } /** * 4ã跨平å°Httpä»»å¡ * åæ°ç¤ºä¾ï¼ * "url: http://www.baidu.com\n" + * "method: get\n" + * "data: content\n"; */ @XxlJob("httpJobHandler") public void httpJobHandler() throws Exception { // param parse String param = XxlJobHelper.getJobParam(); if (param == null || param.trim().length() == 0) { XxlJobHelper.log("param[" + param + "] invalid."); XxlJobHelper.handleFail(); return; } 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) { XxlJobHelper.log("url[" + url + "] invalid."); XxlJobHelper.handleFail(); return; } if (method == null || !Arrays.asList("GET", "POST").contains(method)) { XxlJobHelper.log("method[" + method + "] invalid."); XxlJobHelper.handleFail(); return; } boolean isPostMethod = method.equals("POST"); // 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(isPostMethod); 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 (isPostMethod && 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(); XxlJobHelper.log(responseMsg); return; } catch (Exception e) { XxlJobHelper.log(e); XxlJobHelper.handleFail(); return; } finally { try { if (bufferedReader != null) { bufferedReader.close(); } if (connection != null) { connection.disconnect(); } } catch (Exception e2) { XxlJobHelper.log(e2); } } } /** * 5ãçå½å¨æä»»å¡ç¤ºä¾ï¼ä»»å¡åå§åä¸éæ¯æ¶ï¼æ¯æèªå®ä¹ç¸å ³é»è¾ï¼ */ @XxlJob(value = "demoJobHandler2", init = "init", destroy = "destroy") public void demoJobHandler2() throws Exception { XxlJobHelper.log("XXL-JOB, Hello World."); } public void init() { log.info("init"); } public void destroy() { log.info("destory"); } }