diff --git a/README.md b/README.md index 79eb3b0659cfd4039c7aadb7612c6daa05d80e03..d566ca05c26c27f5d6cce3db764e501278763c1c 100644 --- a/README.md +++ b/README.md @@ -700,6 +700,8 @@ Tips: 历史版本(V1.3.x)目前已经Release至稳定版本, 进入维护阶段 - 4、Jetty升级版本至8.2.0.v20160908; - 5、已推送V1.5.0和V1.5.1至Maven中央仓库; +#### 6.10 版本 V1.5.2 特性 +- 1、IP工具类优化,IP静态缓存; #### 规划中 - 1、集群执行器选择规则自定义:单点=选择第一个,随机=随机选择一个; @@ -712,9 +714,8 @@ Tips: 历史版本(V1.3.x)目前已经Release至稳定版本, 进入维护阶段 - 5、兼容oracle; - 6、跨天日志write问题修复; - 7、rolling日志; -- 8、IP工具类优化,IP静态缓存; -- 9、执行器,server启动,注册逻辑调整; -- 10、通过listener或stop方法,容器销毁时销毁线程;Daemon方式有时不太理想; +- 8、执行器,server启动,注册逻辑调整; +- 9、通过listener或stop方法,容器销毁时销毁线程;Daemon方式有时不太理想; ## 七、其他 diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/callback/XxlJobLogCallbackServer.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/callback/XxlJobLogCallbackServer.java index f884bc87bb13004632221fac167da2baf6ad248d..6d6452bae86abe27e41a9189c18fe21d6adc96f8 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/callback/XxlJobLogCallbackServer.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/callback/XxlJobLogCallbackServer.java @@ -24,10 +24,9 @@ public class XxlJobLogCallbackServer { Server server = null; public void start(int callBackPort) throws Exception { + // init address - - String ip = IpUtil.getIp(); - trigger_log_address = ip.concat(":").concat(String.valueOf(callBackPort)); + trigger_log_address = IpUtil.getIpPort(callBackPort); final int port = Integer.valueOf(callBackPort); new Thread(new Runnable() { diff --git a/xxl-job-core/src/main/java/com/xxl/job/core/executor/jetty/XxlJobExecutor.java b/xxl-job-core/src/main/java/com/xxl/job/core/executor/jetty/XxlJobExecutor.java index 765ef5d13bb13f9c61d7c3a1621129bd97245044..e27120f981849ecdfe4fa9f6d3753b4218c98478 100644 --- a/xxl-job-core/src/main/java/com/xxl/job/core/executor/jetty/XxlJobExecutor.java +++ b/xxl-job-core/src/main/java/com/xxl/job/core/executor/jetty/XxlJobExecutor.java @@ -94,7 +94,7 @@ public class XxlJobExecutor implements ApplicationContextAware { public void run() { while (true) { try { - String address = IpUtil.getIp().concat(":").concat(String.valueOf(port)); + String address = IpUtil.getIpPort(port); registHelper.registry(RegistHelper.RegistType.EXECUTOR.name(), appName, address); TimeUnit.SECONDS.sleep(RegistHelper.TIMEOUT); } catch (Exception e) { diff --git a/xxl-job-core/src/main/java/com/xxl/job/core/util/IpUtil.java b/xxl-job-core/src/main/java/com/xxl/job/core/util/IpUtil.java index c75b465c92a408f4ddc5878c1fd847a18eb41fb0..550d23ebbe25ce9a02a4e56f241dc0d46281f35b 100644 --- a/xxl-job-core/src/main/java/com/xxl/job/core/util/IpUtil.java +++ b/xxl-job-core/src/main/java/com/xxl/job/core/util/IpUtil.java @@ -7,6 +7,7 @@ import java.net.InetAddress; import java.net.NetworkInterface; import java.net.UnknownHostException; import java.util.Enumeration; +import java.util.regex.Pattern; /** * get ip @@ -15,36 +16,112 @@ import java.util.Enumeration; public class IpUtil { private static final Logger logger = LoggerFactory.getLogger(IpUtil.class); + public static final String ANYHOST = "0.0.0.0"; + public static final String LOCALHOST = "127.0.0.1"; + private static final Pattern IP_PATTERN = Pattern.compile("\\d{1,3}(\\.\\d{1,3}){3,5}$"); + + private static volatile InetAddress LOCAL_ADDRESS = null; + + /** + * valid address + * @param address + * @return + */ + private static boolean isValidAddress(InetAddress address) { + if (address == null || address.isLoopbackAddress()) + return false; + String name = address.getHostAddress(); + return (name != null + && ! ANYHOST.equals(name) + && ! LOCALHOST.equals(name) + && IP_PATTERN.matcher(name).matches()); + } + /** - * 获取本机ip - * @return ip + * get first valid addredd + * @return */ - public static String getIp() { + private static InetAddress getFirstValidAddress() { + InetAddress localAddress = null; + try { + localAddress = InetAddress.getLocalHost(); + if (isValidAddress(localAddress)) { + return localAddress; + } + } catch (Throwable e) { + logger.warn("Failed to retriving ip address, " + e.getMessage(), e); + } try { Enumeration interfaces = NetworkInterface.getNetworkInterfaces(); - InetAddress address = null; - while (interfaces.hasMoreElements()) { - NetworkInterface ni = interfaces.nextElement(); - Enumeration addresses = ni.getInetAddresses(); - while (addresses.hasMoreElements()) { - address = addresses.nextElement(); - if (!address.isLoopbackAddress() && address.getHostAddress().indexOf(":") == -1) { - return address.getHostAddress(); + if (interfaces != null) { + while (interfaces.hasMoreElements()) { + try { + NetworkInterface network = interfaces.nextElement(); + Enumeration addresses = network.getInetAddresses(); + if (addresses != null) { + while (addresses.hasMoreElements()) { + try { + InetAddress address = addresses.nextElement(); + if (isValidAddress(address)) { + return address; + } + } catch (Throwable e) { + logger.warn("Failed to retriving ip address, " + e.getMessage(), e); + } + } + } + } catch (Throwable e) { + logger.warn("Failed to retriving ip address, " + e.getMessage(), e); } } } - logger.info("xxl job getHostAddress fail"); + } catch (Throwable e) { + logger.warn("Failed to retriving ip address, " + e.getMessage(), e); + } + logger.error("Could not get local host ip address, will use 127.0.0.1 instead."); + return localAddress; + } + + /** + * get address + * @return + */ + private static InetAddress getAddress() { + if (LOCAL_ADDRESS != null) + return LOCAL_ADDRESS; + InetAddress localAddress = getFirstValidAddress(); + LOCAL_ADDRESS = localAddress; + return localAddress; + } + + /** + * get ip + * @return + */ + public static String getIp(){ + InetAddress address = getAddress(); + if (address==null) { return null; - } catch (Throwable t) { - logger.error("xxl job getHostAddress error, {}", t); + } + return address.getHostAddress(); + } + + /** + * get ip:port + * @param port + * @return + */ + public static String getIpPort(int port){ + String ip = getIp(); + if (ip==null) { return null; } + return ip.concat(":").concat(String.valueOf(port)); } public static void main(String[] args) throws UnknownHostException { - System.out.println(InetAddress.getLocalHost().getCanonicalHostName()); - System.out.println(InetAddress.getLocalHost().getHostName()); System.out.println(getIp()); + System.out.println(getIpPort(8080)); } }