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 ac2324f4..e19e162d 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 @@ -129,7 +129,7 @@ public class XxlJobExecutor implements ApplicationContextAware { 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); + port = port>0?port: NetUtil.findAvailablePort(9999,ip); // start server NetComServerFactory.putService(ExecutorBiz.class, new ExecutorBizImpl()); // rpc-service, base on jetty 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 index a10b17be..4642e887 100644 --- 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 @@ -2,8 +2,10 @@ package com.xxl.job.core.util; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.util.StringUtils; import java.io.IOException; +import java.net.InetSocketAddress; import java.net.ServerSocket; /** @@ -15,23 +17,24 @@ public class NetUtil { private static Logger logger = LoggerFactory.getLogger(NetUtil.class); /** - * find avaliable port + * find avaliable port by ip * * @param defaultPort + * @param ip * @return */ - public static int findAvailablePort(int defaultPort) { + public static int findAvailablePort(int defaultPort,String ip) { int portTmp = defaultPort; while (portTmp < 65535) { - if (!isPortUsed(portTmp)) { + if (!isPortUsed(portTmp,ip)) { return portTmp; } else { portTmp++; } } - portTmp = defaultPort--; + portTmp = --defaultPort; while (portTmp > 0) { - if (!isPortUsed(portTmp)) { + if (!isPortUsed(portTmp,ip)) { return portTmp; } else { portTmp--; @@ -40,18 +43,34 @@ public class NetUtil { throw new IllegalStateException("no available port."); } + /** + * find avaliable port + * + * @param defaultPort + * @return + */ + public static int findAvailablePort(int defaultPort) { + return findAvailablePort(defaultPort,null); + } + + /** * check port used * * @param port + * @param ip 为空则为 InetAddress.anyLocalAddress() * @return */ - public static boolean isPortUsed(int port) { + public static boolean isPortUsed(int port,String ip) { boolean used = false; ServerSocket serverSocket = null; try { - serverSocket = new ServerSocket(port); - used = false; + if(StringUtils.isEmpty(ip)){ + serverSocket = new ServerSocket(port); + }else { + serverSocket = new ServerSocket(); + serverSocket.bind(new InetSocketAddress(ip,port)); + } } catch (IOException e) { logger.debug(">>>>>>>>>>> xxl-job, port[{}] is in use.", port); used = true; 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 index afa930db..ba5543a6 100644 --- 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 @@ -29,7 +29,7 @@ - +