From d4df7efb9b4bfd4ced25c2afba0848b40294b4df Mon Sep 17 00:00:00 2001 From: LQS <2506203757@qq.com> Date: Wed, 24 Jul 2024 20:49:05 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/.gitignore | 8 +++ .idea/compiler.xml | 13 ++++ .idea/encodings.xml | 7 ++ .idea/jarRepositories.xml | 35 ++++++++++ .idea/misc.xml | 18 +++++ .idea/vcs.xml | 6 ++ pom.xml | 37 ++++++++++ .../com/muyu/common/xxl/XXLJobConfig.java | 28 ++++++++ .../com/muyu/common/xxl/XxlJobProperties.java | 63 ++++++++++++++++++ .../common/xxl/demo/XxlJobDemoService.java | 28 ++++++++ ...ot.autoconfigure.AutoConfiguration.imports | 3 + ...ot.autoconfigure.AutoConfiguration.imports | 3 + .../com/muyu/common/xxl/XXLJobConfig.class | Bin 0 -> 2015 bytes .../muyu/common/xxl/XxlJobProperties.class | Bin 0 -> 4634 bytes .../common/xxl/demo/XxlJobDemoService.class | Bin 0 -> 1357 bytes target/cloud-common-xxl-3.6.3.jar | Bin 0 -> 6676 bytes target/maven-archiver/pom.properties | 5 ++ .../compile/default-compile/createdFiles.lst | 3 + .../compile/default-compile/inputFiles.lst | 3 + 19 files changed, 260 insertions(+) create mode 100644 .idea/.gitignore create mode 100644 .idea/compiler.xml create mode 100644 .idea/encodings.xml create mode 100644 .idea/jarRepositories.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/vcs.xml create mode 100644 pom.xml create mode 100644 src/main/java/com/muyu/common/xxl/XXLJobConfig.java create mode 100644 src/main/java/com/muyu/common/xxl/XxlJobProperties.java create mode 100644 src/main/java/com/muyu/common/xxl/demo/XxlJobDemoService.java create mode 100644 src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports create mode 100644 target/classes/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports create mode 100644 target/classes/com/muyu/common/xxl/XXLJobConfig.class create mode 100644 target/classes/com/muyu/common/xxl/XxlJobProperties.class create mode 100644 target/classes/com/muyu/common/xxl/demo/XxlJobDemoService.class create mode 100644 target/cloud-common-xxl-3.6.3.jar create mode 100644 target/maven-archiver/pom.properties create mode 100644 target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst create mode 100644 target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..13566b8 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..e4e89fb --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000..aa00ffa --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml new file mode 100644 index 0000000..e6fa7ca --- /dev/null +++ b/.idea/jarRepositories.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..9e1cc11 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,18 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..4af9214 --- /dev/null +++ b/pom.xml @@ -0,0 +1,37 @@ + + + 4.0.0 + + com.muyu + cloud-common + 3.6.3 + + + cloud-common-xxl + + XllJob定时任务 + + + 17 + 17 + UTF-8 + + + + + + + com.muyu + cloud-common-core + + + + + com.xuxueli + xxl-job-core + + + + \ No newline at end of file diff --git a/src/main/java/com/muyu/common/xxl/XXLJobConfig.java b/src/main/java/com/muyu/common/xxl/XXLJobConfig.java new file mode 100644 index 0000000..0bf4362 --- /dev/null +++ b/src/main/java/com/muyu/common/xxl/XXLJobConfig.java @@ -0,0 +1,28 @@ +package com.muyu.common.xxl; + +import com.muyu.common.core.utils.StringUtils; +import com.xxl.job.core.executor.impl.XxlJobSpringExecutor; +import lombok.extern.log4j.Log4j2; +import org.springframework.context.annotation.Bean; +import org.springframework.stereotype.Component; + +@Log4j2 +@Component +public class XXLJobConfig { + @Bean + public XxlJobSpringExecutor xxlJobExecutor(XxlJobProperties xxlJobProperties) { + if (StringUtils.isEmpty(xxlJobProperties.getAdminAddresses())){ + throw new RuntimeException("请在bootstrap.yml当中配置shared-configs项,xxl-job共享配置[application-xxl-config]"); + } + XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor(); + xxlJobSpringExecutor.setAdminAddresses(xxlJobProperties.getAdminAddresses()); + xxlJobSpringExecutor.setAppname(xxlJobProperties.getAppName()); + xxlJobSpringExecutor.setIp(xxlJobProperties.getIp()); + xxlJobSpringExecutor.setPort(xxlJobProperties.getPort()); + xxlJobSpringExecutor.setAccessToken(xxlJobProperties.getAccessToken()); + xxlJobSpringExecutor.setLogPath(xxlJobProperties.getLogPath()); + xxlJobSpringExecutor.setLogRetentionDays(xxlJobProperties.getLogRetentionDays()); + log.info(">>>>>>>>>>> xxl-job config init success."); + return xxlJobSpringExecutor; + } +} diff --git a/src/main/java/com/muyu/common/xxl/XxlJobProperties.java b/src/main/java/com/muyu/common/xxl/XxlJobProperties.java new file mode 100644 index 0000000..c1428f7 --- /dev/null +++ b/src/main/java/com/muyu/common/xxl/XxlJobProperties.java @@ -0,0 +1,63 @@ +package com.muyu.common.xxl; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +@Data +@Configuration +@ConfigurationProperties(prefix = "xxl-job") +public class XxlJobProperties { + + /** + * 调度中心部署根地址 [选填]: + * 如调度中心集群部署存在多个地址则用逗号分隔。执行器将会使用该地址进行"执行器心跳注册"和"任务结果回调"; + * 为空则关闭自动注册; + */ + private String adminAddresses; + + /** + * 执行器通讯TOKEN [选填]: + * 非空时启用; + */ + private String accessToken; + + /** + * 执行器AppName [选填]: + * 执行器心跳注册分组依据;为空则关闭自动注册 + */ + private String appName; + + /** + * 执行器注册 [选填]: + * 优先使用该配置作为注册地址,为空时使用内嵌服务 ”IP:PORT“ 作为注册地址。 + * 从而更灵活的支持容器类型执行器动态IP和动态映射端口问题。 + */ + private String address; + + /** + * 执行器IP [选填]: + * 默认为空表示自动获取IP,多网卡时可手动设置指定IP,该IP不会绑定Host仅作为通讯实用; + * 地址信息用于 "执行器注册" 和 "调度中心请求并触发任务"; + */ + private String ip; + + /** + * 执行器端口号 [选填]: + * 小于等于0则自动获取;默认端口为9999, + * 单机部署多个执行器时,注意要配置不同执行器端口; + */ + private int port; + + /** + * 执行器运行日志文件存储磁盘路径 [选填]: + * 需要对该路径拥有读写权限;为空则使用默认路径; + */ + private String logPath; + + /** + * 执行器日志文件保存天数 [选填]: + * 过期日志自动清理, 限制值大于等于3时生效; 否则, 如-1, 关闭自动清理功能; + */ + private int logRetentionDays; +} diff --git a/src/main/java/com/muyu/common/xxl/demo/XxlJobDemoService.java b/src/main/java/com/muyu/common/xxl/demo/XxlJobDemoService.java new file mode 100644 index 0000000..9b5dabf --- /dev/null +++ b/src/main/java/com/muyu/common/xxl/demo/XxlJobDemoService.java @@ -0,0 +1,28 @@ +package com.muyu.common.xxl.demo; + +import com.xxl.job.core.context.XxlJobHelper; +import com.xxl.job.core.handler.annotation.XxlJob; +import lombok.extern.log4j.Log4j2; +import org.springframework.stereotype.Component; + +@Log4j2 +@Component +public class XxlJobDemoService { + + /** + * 无参测试 + */ + @XxlJob("xxl-job-demo-no-param") + public void xxlJobDemoNoParam(){ + log.info("调度名称:[{}] - 无参", "xxl-job-demo-no-param"); + } + + /** + * 有参测试 + */ + @XxlJob("xxl-job-demo-one-param") + public void xxlJobDemoOneParam(){ + String param = XxlJobHelper.getJobParam(); + log.info("调度名称:[{}] - 参数:[{}]", "xxl-job-demo-one-param", param); + } +} diff --git a/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports new file mode 100644 index 0000000..1404a51 --- /dev/null +++ b/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -0,0 +1,3 @@ +com.muyu.common.xxl.XXLJobConfig +com.muyu.common.xxl.XxlJobProperties +com.muyu.common.xxl.demo.XxlJobDemoService \ No newline at end of file diff --git a/target/classes/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/target/classes/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports new file mode 100644 index 0000000..1404a51 --- /dev/null +++ b/target/classes/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -0,0 +1,3 @@ +com.muyu.common.xxl.XXLJobConfig +com.muyu.common.xxl.XxlJobProperties +com.muyu.common.xxl.demo.XxlJobDemoService \ No newline at end of file diff --git a/target/classes/com/muyu/common/xxl/XXLJobConfig.class b/target/classes/com/muyu/common/xxl/XXLJobConfig.class new file mode 100644 index 0000000000000000000000000000000000000000..cd91475cf93d5b3635ee647d446161422666f3e3 GIT binary patch literal 2015 zcmbVNTT@$A6#h1WCZva3fVLpo&>{v39Brw$&?@CpsevL;gjUp@lTA2~oPFk;6AeG0 zZ~EkuGrsiA8OKX?CeYUEyRZI*GTJBqf#X_9xQJDpCNpR4z4p3(d#$y9`Sboy04`x8 ziW-E%s5MZBV*<_V@*`>Hq?0wTr`MGg2pk)+9Xq%z5K8ndMiD`M7*PYqVF>hCI&bC+ zn+1~=dF`0RV$NJD=C0}VtfyV&1-9}9TCyq_&E#!oG?Vd^?=!D0(U;nHHXnGllTAj^ zh^8=_4YVL8(0katr9EX90z2oM6^$Fb76{w^MBWWH1=X(o>m1OFOG} z)_;8G-XA}HLirA^>-5g;yN~XFRS~--T{mZ2lI;%ic|~C*idLLrm^=O@%Ed6A5xBrP zGmK=GP^ElTQCWpRd#0UtchQ}98Lx@zNfez3@#i@Mr`djse;9DSxNZYy_|~F)9j-eg z^NN*v3_Q*rYiMw(ZI`WxRJxKEUJeEy`db|dey*d?4glEId~L7(!j`W@F|_0 zmBAWoTsH8=Zt#2T2u2ND;lNtS2eIc=pyO*xQe&Jm@;q; zZwtf^7a?EH(o%|Qe5_mwlypvK1-et(%bL=a)|xVjlcgJCI=pU@i>&gJ5ljmtF7N;1 z)%qbHTvT!Hw76d=XFhZs*D)K$I|k-B!_!At7pS$JRUO3wZiKOD;9V>Uoc%AYY3WFc zOQ602Q+Yjnu!F{O()W{nM`lLO$8<&sG^K1u%@p!!Yz)IrDYKP_yh5Z!0L=KxP4i8SS-v8&3##%-9@BJxo@hL-T zm=C12F)iIHZXMOhwP^b`p*iX}Iw(&X0&}o@OMZDWta{YNA8T)eMu-!rVqnTWQS*wD z4y73xv2xYX9-Y?(&r*{%Us%h*;vV9mDbW8!+kT)trGrgZnPWQdYKNLEiEiqj8hTx5 z;&KPkDnx5~Ug*0_JCmp&TGzh?ahDb~xJh3=20bgc=xbC2@E%rZN23`ZkQ6KbO2$G& zKRj1LcpD9$qu~Ksmt*Z)IQjDfbS`h9YkGhWOL&%Pyo9q%drRnJI#9xkOovN&h3V@h zTw?lW31i=5GM2iBnHmgyM?OO3xXx2Fpm!;XCbZGJ)P)#&XqFGqZW!$}l}=zBCy~M_ zYP}AMwX>W8}!vAiIZDcNqqtK6Z5*^FLsc U(GmyHswXRJ#H)e5XJj4t3yd-+JOBUy literal 0 HcmV?d00001 diff --git a/target/classes/com/muyu/common/xxl/XxlJobProperties.class b/target/classes/com/muyu/common/xxl/XxlJobProperties.class new file mode 100644 index 0000000000000000000000000000000000000000..5663724f440cbaf0ab4a091d0dca1897525b53a1 GIT binary patch literal 4634 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 b|0Yg+gildmEjlO(FVL9_7i*rBIy1m8B^+C* literal 0 HcmV?d00001 diff --git a/target/cloud-common-xxl-3.6.3.jar b/target/cloud-common-xxl-3.6.3.jar new file mode 100644 index 0000000000000000000000000000000000000000..816187405cd9b7d26ce619137ea11e5cf9df2b4a GIT binary patch literal 6676 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

kY4 zB5PEg00C-%0J2=QPA}zpNeO~B;d39RRfXDxz+co}sQ(jv)6=Q~e6Q4?YJ$gzXFf(} z%;KjbS65N|d`Opyb{+r6kkwWDzymH38*9h#0muK$d17aQZIpNma=7Q=8-1kqdkz#Q zjB9CL+}Qh}+E0w=5yG!wj^im08gAfbY!}DV{Y?YMTOKr=1_s;3Y5WuFf1V-b53TPr zJcW(jLp5yYfYto7HjdXkXt+V8f1`bnBmRtl<2jEI9R7gt59@gZ^E=-22qqm1bLjCy z7W9Yq?|IN4W~6xy{LP3zu%bsR^Ly^-2>ly&Y5(nFoRfZKlKzeP?=#^MrYm;we~bCs z6XMUfzblDHxc%6-