diff options
Diffstat (limited to 'xxl-job-executor-samples/xxl-job-executor-sample-spring')
8 files changed, 414 insertions, 0 deletions
diff --git a/xxl-job-executor-samples/xxl-job-executor-sample-spring/pom.xml b/xxl-job-executor-samples/xxl-job-executor-sample-spring/pom.xml new file mode 100644 index 0000000..1e13ed7 --- /dev/null +++ b/xxl-job-executor-samples/xxl-job-executor-sample-spring/pom.xml @@ -0,0 +1,52 @@ +<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"> + <modelVersion>4.0.0</modelVersion> + <parent> + <groupId>com.xuxueli</groupId> + <artifactId>xxl-job-executor-samples</artifactId> + <version>2.2.0-SNAPSHOT</version> + </parent> + <artifactId>xxl-job-executor-sample-spring</artifactId> + <packaging>war</packaging> + + <name>${project.artifactId}</name> + <description>Executor project for spring boot.</description> + <url>https://www.xuxueli.com/</url> + + <dependencies> + <!-- spring-webmvc --> + <dependency> + <groupId>org.springframework</groupId> + <artifactId>spring-webmvc</artifactId> + <version>${spring.version}</version> + </dependency> + + <!-- slf4j --> + <dependency> + <groupId>org.slf4j</groupId> + <artifactId>slf4j-log4j12</artifactId> + <version>${slf4j-api.version}</version> + </dependency> + + <!-- xxl-job-core --> + <dependency> + <groupId>com.xuxueli</groupId> + <artifactId>xxl-job-core</artifactId> + <version>${project.parent.version}</version> + </dependency> + </dependencies> + + <build> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-war-plugin</artifactId> + <version>${maven-war-plugin.version}</version> + <configuration> + <archiveClasses>false</archiveClasses> + </configuration> + </plugin> + </plugins> + </build> + +</project>
\ No newline at end of file diff --git a/xxl-job-executor-samples/xxl-job-executor-sample-spring/src/main/java/com/xxl/job/executor/service/jobhandler/SampleXxlJob.java b/xxl-job-executor-samples/xxl-job-executor-sample-spring/src/main/java/com/xxl/job/executor/service/jobhandler/SampleXxlJob.java new file mode 100644 index 0000000..f87b777 --- /dev/null +++ b/xxl-job-executor-samples/xxl-job-executor-sample-spring/src/main/java/com/xxl/job/executor/service/jobhandler/SampleXxlJob.java @@ -0,0 +1,193 @@ +package com.xxl.job.executor.service.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.InputStreamReader; +import java.net.HttpURLConnection; +import java.net.URL; +import java.util.concurrent.TimeUnit; + +/** + * XxlJob开发示例(Bean模式) + * + * 开发步骤: + * 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 + */ +@Component +public 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任务 + */ + @XxlJob("httpJobHandler") + public ReturnT<String> httpJobHandler(String param) throws Exception { + + // request + HttpURLConnection connection = null; + BufferedReader bufferedReader = null; + try { + // connection + URL realUrl = new URL(param); + connection = (HttpURLConnection) realUrl.openConnection(); + + // connection setting + connection.setRequestMethod("GET"); + 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(); + + //Map<String, List<String>> map = connection.getHeaderFields(); + + // 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"); + } + + +} diff --git a/xxl-job-executor-samples/xxl-job-executor-sample-spring/src/main/resources/applicationcontext-xxl-job.xml b/xxl-job-executor-samples/xxl-job-executor-sample-spring/src/main/resources/applicationcontext-xxl-job.xml new file mode 100644 index 0000000..0cfdfb8 --- /dev/null +++ b/xxl-job-executor-samples/xxl-job-executor-sample-spring/src/main/resources/applicationcontext-xxl-job.xml @@ -0,0 +1,43 @@ +<?xml version="1.0" encoding="UTF-8"?> +<beans xmlns="http://www.springframework.org/schema/beans" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xmlns:context="http://www.springframework.org/schema/context" + xsi:schemaLocation="http://www.springframework.org/schema/beans + http://www.springframework.org/schema/beans/spring-beans.xsd + http://www.springframework.org/schema/context + http://www.springframework.org/schema/context/spring-context.xsd"> + + <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> + <property name="fileEncoding" value="utf-8" /> + <property name="locations"> + <list> + <value>classpath*:xxl-job-executor.properties</value> + </list> + </property> + </bean> + + <!-- ********************************* 基础配置 ********************************* --> + + <!-- 配置01、JobHandler 扫描路径 --> + <context:component-scan base-package="com.xxl.job.executor.service.jobhandler" /> + + <!-- 配置02、执行器 --> + <bean id="xxlJobSpringExecutor" class="com.xxl.job.core.executor.impl.XxlJobSpringExecutor" > + <!-- 执行器注册中心地址[选填],为空则关闭自动注册 --> + <property name="adminAddresses" value="${xxl.job.admin.addresses}" /> + <!-- 执行器AppName[选填],为空则关闭自动注册 --> + <property name="appName" value="${xxl.job.executor.appname}" /> + <!-- 执行器IP[选填],为空则自动获取 --> + <property name="ip" value="${xxl.job.executor.ip}" /> + <!-- 执行器端口号[选填],小于等于0则自动获取 --> + <property name="port" value="${xxl.job.executor.port}" /> + <!-- 访问令牌[选填],非空则进行匹配校验 --> + <property name="accessToken" value="${xxl.job.accessToken}" /> + <!-- 执行器日志路径[选填],为空则使用默认路径 --> + <property name="logPath" value="${xxl.job.executor.logpath}" /> + <!-- 日志保存天数[选填],值大于3时生效 --> + <property name="logRetentionDays" value="${xxl.job.executor.logretentiondays}" /> + </bean> + + +</beans>
\ No newline at end of file diff --git a/xxl-job-executor-samples/xxl-job-executor-sample-spring/src/main/resources/log4j.xml b/xxl-job-executor-samples/xxl-job-executor-sample-spring/src/main/resources/log4j.xml new file mode 100644 index 0000000..f0a7fc6 --- /dev/null +++ b/xxl-job-executor-samples/xxl-job-executor-sample-spring/src/main/resources/log4j.xml @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE log4j:configuration PUBLIC "-//log4j/log4j Configuration//EN" "log4j.dtd"> +<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" threshold="null" debug="null"> + + <appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender"> + <param name="Target" value="System.out" /> + <layout class="org.apache.log4j.PatternLayout"> + <param name="ConversionPattern" value="%-d{yyyy-MM-dd HH:mm:ss} xxl-job-executor-sample-spring [%c]-[%t]-[%M]-[%L]-[%p] %m%n"/> + </layout> + </appender> + + <appender name="FILE" class="org.apache.log4j.DailyRollingFileAppender"> + <param name="file" value="/data/applogs/xxl-job/xxl-job-executor-sample-spring.log"/> + <param name="append" value="true"/> + <param name="encoding" value="UTF-8"/> + <layout class="org.apache.log4j.PatternLayout"> + <param name="ConversionPattern" value="%-d{yyyy-MM-dd HH:mm:ss} xxl-job-executor-sample-spring [%c]-[%t]-[%M]-[%L]-[%p] %m%n"/> + </layout> + </appender> + + <root> + <level value="INFO" /> + <appender-ref ref="CONSOLE" /> + <appender-ref ref="FILE" /> + </root> + + <!--<logger name="com.xxl.job.executor.service.jobhandler" additivity="false"> + <level value="INFO" /> + <appender-ref ref="CONSOLE" /> + <appender-ref ref="FILE" /> + </logger>--> + +</log4j:configuration>
\ No newline at end of file diff --git a/xxl-job-executor-samples/xxl-job-executor-sample-spring/src/main/resources/xxl-job-executor.properties b/xxl-job-executor-samples/xxl-job-executor-sample-spring/src/main/resources/xxl-job-executor.properties new file mode 100644 index 0000000..4032e67 --- /dev/null +++ b/xxl-job-executor-samples/xxl-job-executor-sample-spring/src/main/resources/xxl-job-executor.properties @@ -0,0 +1,15 @@ +### 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 executor address +xxl.job.executor.appname=xxl-job-executor-sample +xxl.job.executor.ip= +xxl.job.executor.port=9998 + +### xxl-job, access token +xxl.job.accessToken= + +### xxl-job log path +xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler +### xxl-job log retention days +xxl.job.executor.logretentiondays=30 diff --git a/xxl-job-executor-samples/xxl-job-executor-sample-spring/src/main/webapp/WEB-INF/web.xml b/xxl-job-executor-samples/xxl-job-executor-sample-spring/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 0000000..9179af7 --- /dev/null +++ b/xxl-job-executor-samples/xxl-job-executor-sample-spring/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="UTF-8"?> +<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee" + xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" + id="WebApp_ID" version="2.5"> + + <display-name>xxl-job-executor-sample-spring</display-name> + <context-param> + <param-name>webAppRootKey</param-name> + <param-value>xxl-job-executor-sample-spring</param-value> + </context-param> + + <!-- spring --> + <context-param> + <param-name>contextConfigLocation</param-name> + <param-value>classpath*:applicationcontext-*.xml</param-value> + </context-param> + + <listener> + <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class> + </listener> + <listener> + <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> + </listener> + + + <welcome-file-list> + <welcome-file>index.html</welcome-file> + </welcome-file-list> + +</web-app>
\ No newline at end of file diff --git a/xxl-job-executor-samples/xxl-job-executor-sample-spring/src/main/webapp/index.html b/xxl-job-executor-samples/xxl-job-executor-sample-spring/src/main/webapp/index.html new file mode 100644 index 0000000..7085239 --- /dev/null +++ b/xxl-job-executor-samples/xxl-job-executor-sample-spring/src/main/webapp/index.html @@ -0,0 +1 @@ +i am alive.
\ No newline at end of file diff --git a/xxl-job-executor-samples/xxl-job-executor-sample-spring/xxl-job-executor-sample-spring.iml b/xxl-job-executor-samples/xxl-job-executor-sample-spring/xxl-job-executor-sample-spring.iml new file mode 100644 index 0000000..77aee8b --- /dev/null +++ b/xxl-job-executor-samples/xxl-job-executor-sample-spring/xxl-job-executor-sample-spring.iml @@ -0,0 +1,46 @@ +<?xml version="1.0" encoding="UTF-8"?> +<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4"> + <component name="FacetManager"> + <facet type="web" name="Web"> + <configuration> + <descriptors> + <deploymentDescriptor name="web.xml" url="file://$MODULE_DIR$/src/main/webapp/WEB-INF/web.xml" /> + </descriptors> + <webroots> + <root url="file://$MODULE_DIR$/src/main/webapp" relative="/" /> + </webroots> + </configuration> + </facet> + <facet type="Spring" name="Spring"> + <configuration /> + </facet> + </component> + <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_7"> + <output url="file://$MODULE_DIR$/target/classes" /> + <output-test url="file://$MODULE_DIR$/target/test-classes" /> + <content url="file://$MODULE_DIR$"> + <sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" /> + <sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" /> + <excludeFolder url="file://$MODULE_DIR$/target" /> + </content> + <orderEntry type="inheritedJdk" /> + <orderEntry type="sourceFolder" forTests="false" /> + <orderEntry type="library" name="Maven: org.springframework:spring-webmvc:4.3.25.RELEASE" level="project" /> + <orderEntry type="library" name="Maven: org.springframework:spring-aop:4.3.25.RELEASE" level="project" /> + <orderEntry type="library" name="Maven: org.springframework:spring-beans:4.3.25.RELEASE" level="project" /> + <orderEntry type="library" name="Maven: org.springframework:spring-context:4.3.25.RELEASE" level="project" /> + <orderEntry type="library" name="Maven: org.springframework:spring-core:4.3.25.RELEASE" level="project" /> + <orderEntry type="library" name="Maven: commons-logging:commons-logging:1.2" level="project" /> + <orderEntry type="library" name="Maven: org.springframework:spring-expression:4.3.25.RELEASE" level="project" /> + <orderEntry type="library" name="Maven: org.springframework:spring-web:4.3.25.RELEASE" level="project" /> + <orderEntry type="library" name="Maven: org.slf4j:slf4j-log4j12:1.7.29" level="project" /> + <orderEntry type="library" name="Maven: org.slf4j:slf4j-api:1.7.29" level="project" /> + <orderEntry type="library" name="Maven: log4j:log4j:1.2.17" level="project" /> + <orderEntry type="module" module-name="xxl-job-core" /> + <orderEntry type="library" name="Maven: com.xuxueli:xxl-rpc-core:1.5.0" level="project" /> + <orderEntry type="library" name="Maven: io.netty:netty-all:4.1.43.Final" level="project" /> + <orderEntry type="library" name="Maven: com.caucho:hessian:4.0.63" level="project" /> + <orderEntry type="library" name="Maven: com.xuxueli:xxl-registry-client:1.1.0" level="project" /> + <orderEntry type="library" name="Maven: org.codehaus.groovy:groovy:2.5.8" level="project" /> + </component> +</module>
\ No newline at end of file |
