From 41328f479572e95879ee09a06a17a0922bfe0677 Mon Sep 17 00:00:00 2001 From: xuxueli <931591021@qq.com> Date: Wed, 29 Nov 2017 17:33:08 +0800 Subject: [PATCH] =?UTF-8?q?=E6=89=A7=E8=A1=8C=E5=99=A8=E7=AB=AF=E5=8F=A3?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E9=9A=8F=E6=9C=BA=E7=94=9F=E6=88=90(?= =?UTF-8?q?=E5=B0=8F=E4=BA=8E=E7=AD=89=E4=BA=8E0=E6=97=B6)=EF=BC=8C?= =?UTF-8?q?=E9=81=BF=E5=85=8D=E7=AB=AF=E5=8F=A3=E5=AE=9A=E4=B9=89=E5=86=B2?= =?UTF-8?q?=E7=AA=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/XXL-JOB官方文档.md | 5 +- .../xxl/job/core/executor/XxlJobExecutor.java | 7 +- .../java/com/xxl/job/core/util/NetUtil.java | 70 +++++++++++++++++++ 3 files changed, 79 insertions(+), 3 deletions(-) create mode 100644 xxl-job-core/src/main/java/com/xxl/job/core/util/NetUtil.java diff --git a/doc/XXL-JOB官方文档.md b/doc/XXL-JOB官方文档.md index a2deb935..c3543a11 100644 --- a/doc/XXL-JOB官方文档.md +++ b/doc/XXL-JOB官方文档.md @@ -1053,6 +1053,7 @@ Tips: 历史版本(V1.3.x)目前已经Release至稳定版本, 进入维护阶段 - 7、底层系统日志级别规范调整,清理遗留代码; - 8、修改JobThread捕获Error错误不更新JobLog的问题; - 9、任务注解调整为 “@JobHandler”,与任务注解统一; +- 10、执行器端口支持随机生成(小于等于0时),避免端口定义冲突; ### TODO LIST - 1、任务权限管理:执行器为粒度分配权限,核心操作校验权限; @@ -1075,8 +1076,8 @@ Tips: 历史版本(V1.3.x)目前已经Release至稳定版本, 进入维护阶段 - 18、JobHandler提供 init/destroy 方法,支持自定义任务线程销毁逻辑; - 19、cron表达式的最大长度调整,兼容复杂类型cron; - 20、执行器回调地址/日志地址格式兼容,是否已"/"结尾均支持; -- 21、执行器端口支持随机生成,避免端口冲突; -- 22、任务单机多线程:提升任务单机并行处理能力; +- 21、任务单机多线程:提升任务单机并行处理能力; + ## 七、其他 diff --git a/xxl-job-core/src/main/java/com/xxl/job/core/executor/XxlJobExecutor.java b/xxl-job-core/src/main/java/com/xxl/job/core/executor/XxlJobExecutor.java index d35dbe9c..4ecb461c 100644 --- a/xxl-job-core/src/main/java/com/xxl/job/core/executor/XxlJobExecutor.java +++ b/xxl-job-core/src/main/java/com/xxl/job/core/executor/XxlJobExecutor.java @@ -9,6 +9,7 @@ import com.xxl.job.core.log.XxlJobFileAppender; import com.xxl.job.core.rpc.netcom.NetComClientProxy; import com.xxl.job.core.rpc.netcom.NetComServerFactory; import com.xxl.job.core.thread.JobThread; +import com.xxl.job.core.util.NetUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.BeansException; @@ -28,7 +29,7 @@ public class XxlJobExecutor implements ApplicationContextAware { // ---------------------- param ---------------------- private String ip; - private int port = 9999; + private int port; private String appName; private String adminAddresses; private String accessToken; @@ -121,6 +122,10 @@ public class XxlJobExecutor implements ApplicationContextAware { // ---------------------- executor-server(jetty) ---------------------- private NetComServerFactory serverFactory = new NetComServerFactory(); private void initExecutorServer(int port, String ip, String appName, String accessToken) throws Exception { + // valid param + port = port>0?port: NetUtil.findAvailablePort(9999); + + // start server NetComServerFactory.putService(ExecutorBiz.class, new ExecutorBizImpl()); // rpc-service, base on jetty NetComServerFactory.setAccessToken(accessToken); serverFactory.start(port, ip, appName); // jetty + registry diff --git a/xxl-job-core/src/main/java/com/xxl/job/core/util/NetUtil.java b/xxl-job-core/src/main/java/com/xxl/job/core/util/NetUtil.java new file mode 100644 index 00000000..118a0fa5 --- /dev/null +++ b/xxl-job-core/src/main/java/com/xxl/job/core/util/NetUtil.java @@ -0,0 +1,70 @@ +package com.xxl.job.core.util; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.net.ServerSocket; + +/** + * net util + * + * @author xuxueli 2017-11-29 17:00:25 + */ +public class NetUtil { + private static Logger logger = LoggerFactory.getLogger(NetUtil.class); + + /** + * find avaliable port + * + * @param defaultPort + * @return + */ + public static int findAvailablePort(int defaultPort) { + int portTmp = defaultPort; + while (portTmp < 65535) { + if (!isPortUsed(portTmp)) { + return portTmp; + } else { + portTmp++; + } + } + portTmp = defaultPort--; + while (portTmp > 0) { + if (!isPortUsed(portTmp)) { + return portTmp; + } else { + portTmp--; + } + } + throw new IllegalStateException("no available port."); + } + + /** + * check port used + * + * @param port + * @return + */ + public static boolean isPortUsed(int port) { + boolean used = false; + ServerSocket serverSocket = null; + try { + serverSocket = new ServerSocket(port); + used = false; + } catch (IOException e) { + logger.info(">>>>>>>>>>> xxl-job, port[{}] is in use.", port); + used = true; + } finally { + if (serverSocket != null) { + try { + serverSocket.close(); + } catch (IOException e) { + logger.info(""); + } + } + } + return used; + } + +}