summaryrefslogtreecommitdiff
path: root/xxl-job-executor-samples/xxl-job-executor-sample-spring
diff options
context:
space:
mode:
Diffstat (limited to 'xxl-job-executor-samples/xxl-job-executor-sample-spring')
-rw-r--r--xxl-job-executor-samples/xxl-job-executor-sample-spring/pom.xml52
-rw-r--r--xxl-job-executor-samples/xxl-job-executor-sample-spring/src/main/java/com/xxl/job/executor/service/jobhandler/SampleXxlJob.java193
-rw-r--r--xxl-job-executor-samples/xxl-job-executor-sample-spring/src/main/resources/applicationcontext-xxl-job.xml43
-rw-r--r--xxl-job-executor-samples/xxl-job-executor-sample-spring/src/main/resources/log4j.xml33
-rw-r--r--xxl-job-executor-samples/xxl-job-executor-sample-spring/src/main/resources/xxl-job-executor.properties15
-rw-r--r--xxl-job-executor-samples/xxl-job-executor-sample-spring/src/main/webapp/WEB-INF/web.xml31
-rw-r--r--xxl-job-executor-samples/xxl-job-executor-sample-spring/src/main/webapp/index.html1
-rw-r--r--xxl-job-executor-samples/xxl-job-executor-sample-spring/xxl-job-executor-sample-spring.iml46
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