Browse Source

1、新增spring-boot类型执行器example项目;
2、升级jetty版本至9.2;

xueli.xue 7 years ago
parent
commit
a83c21a43a

+ 4 - 2
README.md

@@ -99,9 +99,9 @@ XXL-JOB是一个轻量级分布式任务调度框架,其核心设计目标是
 ![输入图片说明](https://static.oschina.net/uploads/img/201704/25151032_nrJN.png "在这里输入图片标题")
 
 ### 1.5 环境
-- Servlet/JSP Spec:3.0/2.2
+- Servlet/JSP Spec:3.1/2.3
 - JDK:1.7+
-- Tomcat:7+/Jetty8+
+- Tomcat:8.5.x+/Jetty9.2+
 - Mysql:5.6+
 - Maven:3+
 
@@ -813,6 +813,8 @@ Tips: 历史版本(V1.3.x)目前已经Release至稳定版本, 进入维护阶段
 
 #### 6.14 版本 V1.7.0 特性 (Coding)
 - 1、脚本任务:支持以GLUE模式开发和运行脚本任务,包括Shell、Python等类型脚本;
+- 2、新增spring-boot类型执行器example项目;
+- 3、升级jetty版本至9.2;
 - 2、执行器移除GlueLoader依赖改为推送方式,GLUE源码加载不再依赖JDBC;
 - 3、登陆拦截Redirect时获取项目名,解决非根据目录发布时跳转404问题;
 

+ 2 - 1
pom.xml

@@ -14,7 +14,8 @@
 		<module>xxl-job-core</module>
 		<module>xxl-job-admin</module>
 		<module>xxl-job-executor-example</module>
-	</modules>
+        <module>xxl-job-executor-springboot-example</module>
+    </modules>
 
 	<build>
 		<plugins>

+ 1 - 1
xxl-job-core/pom.xml

@@ -34,7 +34,7 @@
 		<dependency>
 			<groupId>org.eclipse.jetty</groupId>
 			<artifactId>jetty-server</artifactId>
-			<version>8.2.0.v20160908</version>
+			<version>9.2.21.v20170120</version>
 		</dependency>
 
 		<!-- slf4j -->

+ 12 - 11
xxl-job-core/src/main/java/com/xxl/job/core/rpc/netcom/jetty/server/JettyServer.java

@@ -5,8 +5,8 @@ import com.xxl.job.core.thread.ExecutorRegistryThread;
 import org.eclipse.jetty.server.Connector;
 import org.eclipse.jetty.server.Handler;
 import org.eclipse.jetty.server.Server;
+import org.eclipse.jetty.server.ServerConnector;
 import org.eclipse.jetty.server.handler.HandlerCollection;
-import org.eclipse.jetty.server.nio.SelectChannelConnector;
 import org.eclipse.jetty.util.thread.ExecutorThreadPool;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -24,21 +24,22 @@ public class JettyServer {
 		thread = new Thread(new Runnable() {
 			@Override
 			public void run() {
-				server = new Server();
-				server.setThreadPool(new ExecutorThreadPool(200, 200, 30000));	// 非阻塞
-				
-				// connector
-				SelectChannelConnector connector = new SelectChannelConnector();
+
+				// The Server
+				server = new Server(new ExecutorThreadPool());  // 非阻塞
+
+				// HTTP connector
+				ServerConnector connector = new ServerConnector(server);
 				connector.setPort(port);
-				connector.setMaxIdleTime(30000);
-				server.setConnectors(new Connector[] { connector });
-				
-				// handler
-				HandlerCollection handlerc =new HandlerCollection();  
+				server.setConnectors(new Connector[]{connector});
+
+				// Set a handler
+				HandlerCollection handlerc =new HandlerCollection();
 				handlerc.setHandlers(new Handler[]{new JettyServerHandler()});
 				server.setHandler(handlerc);
 
 				try {
+					// Start the server
 					server.start();
 					logger.info(">>>>>>>>>>>> xxl-job jetty server start success at port:{}.", port);
 					ExecutorRegistryThread.getInstance().start(port, ip, appName, registHelper);

+ 101 - 0
xxl-job-executor-springboot-example/pom.xml

@@ -0,0 +1,101 @@
+<?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">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>com.xuxueli</groupId>
+        <artifactId>xxl-job</artifactId>
+        <version>1.7.0-SNAPSHOT</version>
+    </parent>
+    <artifactId>xxl-job-executor-springboot-example</artifactId>
+    <packaging>jar</packaging>
+    <name>xxl-job-executor-springboot-example</name>
+    <description>Example executor project for spring boot</description>
+
+    <properties>
+        <xxl-job.version>1.7.0-SNAPSHOT</xxl-job.version>
+        <!--<spring-boot.version>1.5.3.RELEASE</spring-boot.version>-->
+        <spring-boot.version>1.3.8.RELEASE</spring-boot.version>
+
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+        <java.version>1.7</java.version>
+    </properties>
+
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <!-- Import dependency management from Spring Boot (依赖管理:继承一些默认的依赖,工程需要依赖的jar包的管理,申明其他dependency的时候就不需要version) -->
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-starter-parent</artifactId>
+                <version>${spring-boot.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter</artifactId>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.springframework.boot</groupId>
+                    <artifactId>spring-boot-starter-logging</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-log4j</artifactId>
+        </dependency>
+
+        <!-- spring-boot-starter-web (提供了对web的支持,包含了spring webmvc和tomcat等web开发的特性) -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+
+        <!-- c3p0 -->
+        <dependency>
+            <groupId>com.mchange</groupId>
+            <artifactId>c3p0</artifactId>
+            <version>0.9.5.2</version>
+        </dependency>
+        <!-- mysql-connector -->
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+            <version>5.1.29</version>
+        </dependency>
+
+        <!-- xxl-job-core -->
+        <dependency>
+            <groupId>com.xuxueli</groupId>
+            <artifactId>xxl-job-core</artifactId>
+            <version>${xxl-job.version}</version>
+        </dependency>
+
+    </dependencies>
+
+    <build>
+        <plugins>
+            <!-- spring-boot-maven-plugin (提供了直接运行项目的插件:如果是通过parent方式继承spring-boot-starter-parent则不用此插件) -->
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+            </plugin>
+        </plugins>
+    </build>
+
+
+</project>

+ 13 - 0
xxl-job-executor-springboot-example/src/main/java/com/xxl/job/executor/Application.java

@@ -0,0 +1,13 @@
+package com.xxl.job.executor;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class Application {
+
+	public static void main(String[] args) {
+        SpringApplication.run(Application.class, args);
+	}
+
+}

+ 11 - 0
xxl-job-executor-springboot-example/src/main/java/com/xxl/job/executor/core/config/XxlJobConfig.java

@@ -0,0 +1,11 @@
+package com.xxl.job.executor.core.config;
+
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.ImportResource;
+
+
+@Configuration
+@ImportResource("classpath:applicationcontext-xxl-job.xml")
+public class XxlJobConfig {
+
+}

+ 18 - 0
xxl-job-executor-springboot-example/src/main/java/com/xxl/job/executor/mvc/handler/IndexController.java

@@ -0,0 +1,18 @@
+package com.xxl.job.executor.mvc.handler;
+
+import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+@Controller
+@EnableAutoConfiguration
+public class IndexController {
+
+    @RequestMapping("/")
+    @ResponseBody
+    String index() {
+        return "xxl job running.";
+    }
+
+}

+ 39 - 0
xxl-job-executor-springboot-example/src/main/java/com/xxl/job/executor/service/jobhandler/DemoJobHandler.java

@@ -0,0 +1,39 @@
+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.JobHander;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+
+import java.util.concurrent.TimeUnit;
+
+
+/**
+ * 任务Handler的一个Demo(Bean模式)
+ * 
+ * 开发步骤:
+ * 1、继承 “IJobHandler” ;
+ * 2、装配到Spring,例如加 “@Service” 注解;
+ * 3、加 “@JobHander” 注解,注解value值为新增任务生成的JobKey的值;多个JobKey用逗号分割;
+ * 
+ * @author xuxueli 2015-12-19 19:43:36
+ */
+@JobHander(value="demoJobHandler")
+@Service
+public class DemoJobHandler extends IJobHandler {
+	private static transient Logger logger = LoggerFactory.getLogger(DemoJobHandler.class);
+	
+	@Override
+	public ReturnT<String> execute(String... params) throws Exception {
+		logger.info("XXL-JOB, Hello World.");
+		
+		for (int i = 0; i < 5; i++) {
+			logger.info("beat at:{}", i);
+			TimeUnit.SECONDS.sleep(2);
+		}
+		return ReturnT.SUCCESS;
+	}
+	
+}

+ 1 - 0
xxl-job-executor-springboot-example/src/main/resources/application.properties

@@ -0,0 +1 @@
+server.port=8081

+ 59 - 0
xxl-job-executor-springboot-example/src/main/resources/applicationcontext-xxl-job.xml

@@ -0,0 +1,59 @@
+<?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-3.0.xsd
+           http://www.springframework.org/schema/context
+           http://www.springframework.org/schema/context/spring-context-3.0.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="xxlJobExecutor" class="com.xxl.job.core.executor.XxlJobExecutor" init-method="start" destroy-method="destroy" >
+		<!-- 执行器IP[选填],为空则自动获取 -->
+		<property name="ip" value="${xxl.job.executor.ip}" />
+		<!-- 执行器端口号 -->
+		<property name="port" value="${xxl.job.executor.port}" />
+        <property name="appName" value="${xxl.job.executor.appname}" />
+        <!-- 执行器注册器 -->
+        <property name="registHelper" >
+            <!-- 执行器 "DbRegistHelper" 依赖 "XXL-JOB公共数据源" ;推荐将其抽象为RPC远程服务, 可取消对JDBC的依赖;如不启用执行自动注册功能,也可忽略JDBC配置;  -->
+            <bean class="com.xxl.job.core.registry.impl.DbRegistHelper" >
+                <!-- XXL-JOB公共数据源 -->
+                <property name="dataSource" ref="xxlJobDataSource" />
+            </bean>
+        </property>
+	</bean>
+
+    <!-- ********************************* "XXL-JOB公共数据源" 配置, 仅在启动 "DbRegistHelper" 时才需要, 否则可删除 ********************************* -->
+
+	<!-- 配置03、XXL-JOB公共数据源 -->
+	<bean id="xxlJobDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
+		<property name="driverClass" value="${xxl.job.db.driverClass}" />
+		<property name="jdbcUrl" value="${xxl.job.db.url}" />
+		<property name="user" value="${xxl.job.db.user}" />
+		<property name="password" value="${xxl.job.db.password}" />
+		<property name="initialPoolSize" value="3" />
+		<property name="minPoolSize" value="2" />
+		<property name="maxPoolSize" value="10" />
+		<property name="maxIdleTime" value="60" />
+		<property name="acquireRetryDelay" value="1000" />
+		<property name="acquireRetryAttempts" value="10" />
+		<property name="preferredTestQuery" value="SELECT 1" />
+	</bean>
+
+
+</beans>

+ 50 - 0
xxl-job-executor-springboot-example/src/main/resources/log4j.xml

@@ -0,0 +1,50 @@
+<?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-springboot-example [%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-springboot-example.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-springboot-example [%c]-[%t]-[%M]-[%L]-[%p] %m%n"/>
+        </layout>
+    </appender>
+    
+    <appender name="xxl-job" class="com.xxl.job.core.log.XxlJobFileAppender">
+        <param name="filePath" value="/data/applogs/xxl-job/jobhandler/"/>
+        <!--<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-springboot-example [%c]-[%t]-[%M]-[%L]-[%p] %m%n"/>
+        </layout>
+    </appender>
+
+
+    <logger name="com.xxl.job.core" additivity="false">
+    	<level value="INFO" />
+        <appender-ref ref="CONSOLE" />
+        <appender-ref ref="FILE" />
+        <appender-ref ref="xxl-job"/>
+    </logger>
+    <logger name="com.xxl.job.executor.service.jobhandler" additivity="false">
+    	<level value="INFO" />
+        <appender-ref ref="CONSOLE" />
+        <appender-ref ref="FILE" />
+        <appender-ref ref="xxl-job"/>
+    </logger>
+    <root>
+        <level value="INFO" />
+        <appender-ref ref="CONSOLE" />
+        <appender-ref ref="FILE" />
+        <appender-ref ref="xxl-job"/>
+    </root>
+
+</log4j:configuration>

+ 10 - 0
xxl-job-executor-springboot-example/src/main/resources/xxl-job-executor.properties

@@ -0,0 +1,10 @@
+### xxl-job db
+xxl.job.db.driverClass=com.mysql.jdbc.Driver
+xxl.job.db.url=jdbc:mysql://localhost:3306/xxl-job?useUnicode=true&characterEncoding=UTF-8
+xxl.job.db.user=root
+xxl.job.db.password=root_pwd
+
+### xxl-job executor address
+xxl.job.executor.appname=xxl-job-executor-example
+xxl.job.executor.ip=
+xxl.job.executor.port=9999

+ 19 - 0
xxl-job-executor-springboot-example/src/test/java/com/xxl/job/executor/test/XxlJobExecutorExampleBootApplicationTests.java

@@ -0,0 +1,19 @@
+package com.xxl.job.executor.test;
+
+import com.xxl.job.executor.Application;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.boot.test.SpringApplicationConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+import org.springframework.test.context.web.WebAppConfiguration;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@SpringApplicationConfiguration(classes = Application.class)
+@WebAppConfiguration
+public class XxlJobExecutorExampleBootApplicationTests {
+
+	@Test
+	public void contextLoads() {
+	}
+
+}