diff --git a/common/src/main/java/org/apache/rocketmq/common/MixAll.java b/common/src/main/java/org/apache/rocketmq/common/MixAll.java index d72681fd53f5f15f370b9aecfb355ae9729cea56..e73aa61ba0d5d3d98f520f29d4cd473c01eb0751 100644 --- a/common/src/main/java/org/apache/rocketmq/common/MixAll.java +++ b/common/src/main/java/org/apache/rocketmq/common/MixAll.java @@ -16,37 +16,21 @@ */ package org.apache.rocketmq.common; -import java.io.ByteArrayInputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileWriter; -import java.io.IOException; -import java.io.InputStream; -import java.lang.annotation.Annotation; -import java.lang.reflect.Field; -import java.lang.reflect.Method; -import java.lang.reflect.Modifier; -import java.net.InetAddress; -import java.net.InetSocketAddress; -import java.net.NetworkInterface; -import java.net.SocketException; -import java.net.URL; -import java.net.URLConnection; -import java.nio.ByteBuffer; -import java.util.ArrayList; -import java.util.Enumeration; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Properties; -import java.util.Set; -import java.util.concurrent.atomic.AtomicLong; import org.apache.rocketmq.common.annotation.ImportantField; import org.apache.rocketmq.common.constant.LoggerName; import org.apache.rocketmq.common.help.FAQUrl; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.io.*; +import java.lang.annotation.Annotation; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; +import java.net.*; +import java.util.*; +import java.util.concurrent.atomic.AtomicLong; + public class MixAll { private static final Logger log = LoggerFactory.getLogger(LoggerName.COMMON_LOGGER_NAME); @@ -141,16 +125,6 @@ public class MixAll { return 0; } - public static long createBrokerId(final String ip, final int port) { - InetSocketAddress isa = new InetSocketAddress(ip, port); - byte[] ipArray = isa.getAddress().getAddress(); - ByteBuffer bb = ByteBuffer.allocate(8); - bb.put(ipArray); - bb.putInt(port); - long value = bb.getLong(0); - return Math.abs(value); - } - public static void string2File(final String str, final String fileName) throws IOException { String tmpFile = fileName + ".tmp"; @@ -240,11 +214,6 @@ public class MixAll { return null; } - public static String findClassPath(Class c) { - URL url = c.getProtectionDomain().getCodeSource().getLocation(); - return url.getPath(); - } - public static void printObjectProperties(final Logger logger, final Object object) { printObjectProperties(logger, object, false); } @@ -394,23 +363,52 @@ public class MixAll { return inetAddressList; } - public static boolean isLocalAddr(String address) { - for (String addr : LOCAL_INET_ADDRESS) { - if (address.contains(addr)) - return true; - } - return false; - } - private static String localhost() { try { - InetAddress addr = InetAddress.getLocalHost(); - return addr.getHostAddress(); + return InetAddress.getLocalHost().getHostAddress(); } catch (Throwable e) { - throw new RuntimeException("InetAddress java.net.InetAddress.getLocalHost() throws UnknownHostException" - + FAQUrl.suggestTodo(FAQUrl.UNKNOWN_HOST_EXCEPTION), - e); + try { + String candidatesHost = getLocalhostByNetworkInterface(); + if (candidatesHost != null) + return candidatesHost; + + } catch (Exception ignored) { + } + + throw new RuntimeException("InetAddress java.net.InetAddress.getLocalHost() throws UnknownHostException" + FAQUrl.suggestTodo(FAQUrl.UNKNOWN_HOST_EXCEPTION), e); + } + } + + //FIXME Reverse logic comparing to RemotingUtil method, consider refactor in RocketMQ 5.0 + public static String getLocalhostByNetworkInterface() throws SocketException { + List candidatesHost = new ArrayList(); + Enumeration enumeration = NetworkInterface.getNetworkInterfaces(); + + while (enumeration.hasMoreElements()) { + NetworkInterface networkInterface = enumeration.nextElement(); + // Workaround for docker0 bridge + if ("docker0".equals(networkInterface.getName()) || !networkInterface.isUp()) { + continue; + } + Enumeration addrs = networkInterface.getInetAddresses(); + while (addrs.hasMoreElements()) { + InetAddress address = addrs.nextElement(); + if (address.isLoopbackAddress()) { + continue; + } + //ip4 highter priority + if (address instanceof Inet6Address) { + candidatesHost.add(address.getHostAddress()); + continue; + } + return address.getHostAddress(); + } + } + + if (!candidatesHost.isEmpty()) { + return candidatesHost.get(0); } + return null; } public static boolean compareAndIncreaseOnly(final AtomicLong target, final long value) { @@ -426,16 +424,6 @@ public class MixAll { return false; } - public static String localhostName() { - try { - return InetAddress.getLocalHost().getHostName(); - } catch (Throwable e) { - throw new RuntimeException("InetAddress java.net.InetAddress.getLocalHost() throws UnknownHostException" - + FAQUrl.suggestTodo(FAQUrl.UNKNOWN_HOST_EXCEPTION), - e); - } - } - public static String humanReadableByteCount(long bytes, boolean si) { int unit = si ? 1000 : 1024; if (bytes < unit) @@ -445,19 +433,4 @@ public class MixAll { return String.format("%.1f %sB", bytes / Math.pow(unit, exp), pre); } - public Set list2Set(List values) { - Set result = new HashSet(); - for (String v : values) { - result.add(v); - } - return result; - } - - public List set2List(Set values) { - List result = new ArrayList(); - for (String v : values) { - result.add(v); - } - return result; - } } diff --git a/common/src/test/java/org/apache/rocketmq/common/MixAllTest.java b/common/src/test/java/org/apache/rocketmq/common/MixAllTest.java index 218b36d2d8be12880458bebba521eb42d8ce18af..3f0487202f04c13485ea165280c3f71583e52efa 100644 --- a/common/src/test/java/org/apache/rocketmq/common/MixAllTest.java +++ b/common/src/test/java/org/apache/rocketmq/common/MixAllTest.java @@ -17,17 +17,14 @@ package org.apache.rocketmq.common; +import org.junit.Test; + import java.io.File; import java.io.IOException; import java.io.PrintWriter; import java.net.InetAddress; -import java.nio.ByteOrder; -import java.nio.CharBuffer; -import java.nio.charset.Charset; -import java.nio.charset.StandardCharsets; import java.util.List; import java.util.concurrent.atomic.AtomicLong; -import org.junit.Test; import static org.assertj.core.api.Assertions.assertThat; @@ -93,4 +90,10 @@ public class MixAllTest { MixAll.string2File("MixAll_testString2File", fileName); assertThat(MixAll.file2String(fileName)).isEqualTo("MixAll_testString2File"); } + + @Test + public void testGetLocalhostByNetworkInterface() throws Exception { + assertThat(MixAll.LOCALHOST).isNotNull(); + assertThat(MixAll.getLocalhostByNetworkInterface()).isNotNull(); + } } diff --git a/remoting/src/main/java/org/apache/rocketmq/remoting/common/RemotingHelper.java b/remoting/src/main/java/org/apache/rocketmq/remoting/common/RemotingHelper.java index 40c594313a89571e797b3aebde6d987c35d497c8..79957305c0fcac5142a09a3e4f78de07c6214200 100644 --- a/remoting/src/main/java/org/apache/rocketmq/remoting/common/RemotingHelper.java +++ b/remoting/src/main/java/org/apache/rocketmq/remoting/common/RemotingHelper.java @@ -17,11 +17,6 @@ package org.apache.rocketmq.remoting.common; import io.netty.channel.Channel; -import java.io.IOException; -import java.net.InetSocketAddress; -import java.net.SocketAddress; -import java.nio.ByteBuffer; -import java.nio.channels.SocketChannel; import org.apache.rocketmq.remoting.exception.RemotingConnectException; import org.apache.rocketmq.remoting.exception.RemotingSendRequestException; import org.apache.rocketmq.remoting.exception.RemotingTimeoutException; @@ -29,6 +24,12 @@ import org.apache.rocketmq.remoting.protocol.RemotingCommand; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.io.IOException; +import java.net.InetSocketAddress; +import java.net.SocketAddress; +import java.nio.ByteBuffer; +import java.nio.channels.SocketChannel; + public class RemotingHelper { public static final String ROCKETMQ_REMOTING = "RocketmqRemoting"; public static final String DEFAULT_CHARSET = "UTF-8"; @@ -168,17 +169,6 @@ public class RemotingHelper { return ""; } - public static String parseChannelRemoteName(final Channel channel) { - if (null == channel) { - return ""; - } - final InetSocketAddress remote = (InetSocketAddress) channel.remoteAddress(); - if (remote != null) { - return remote.getAddress().getHostName(); - } - return ""; - } - public static String parseSocketAddressAddr(SocketAddress socketAddress) { if (socketAddress != null) { final String addr = socketAddress.toString(); @@ -190,13 +180,4 @@ public class RemotingHelper { return ""; } - public static String parseSocketAddressName(SocketAddress socketAddress) { - - final InetSocketAddress addrs = (InetSocketAddress) socketAddress; - if (addrs != null) { - return addrs.getAddress().getHostName(); - } - return ""; - } - } diff --git a/remoting/src/main/java/org/apache/rocketmq/remoting/common/RemotingUtil.java b/remoting/src/main/java/org/apache/rocketmq/remoting/common/RemotingUtil.java index 8d24e76b4f886cfc784a2f54832286d57cf05a53..2fe8752f28a5cd955359d4fbfa1cb18702caef26 100644 --- a/remoting/src/main/java/org/apache/rocketmq/remoting/common/RemotingUtil.java +++ b/remoting/src/main/java/org/apache/rocketmq/remoting/common/RemotingUtil.java @@ -19,20 +19,17 @@ package org.apache.rocketmq.remoting.common; import io.netty.channel.Channel; import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelFutureListener; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import java.io.IOException; import java.lang.reflect.Method; -import java.net.Inet6Address; -import java.net.InetAddress; -import java.net.InetSocketAddress; -import java.net.NetworkInterface; -import java.net.SocketAddress; +import java.net.*; import java.nio.channels.Selector; import java.nio.channels.SocketChannel; import java.nio.channels.spi.SelectorProvider; import java.util.ArrayList; import java.util.Enumeration; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; public class RemotingUtil { public static final String OS_NAME = System.getProperty("os.name"); diff --git a/remoting/src/main/java/org/apache/rocketmq/remoting/common/ServiceThread.java b/remoting/src/main/java/org/apache/rocketmq/remoting/common/ServiceThread.java index 323c0890164f971e7d4a488b7dc6a694023f0167..346e72c5a2a087fa4b184b900f831f1b0218dfee 100644 --- a/remoting/src/main/java/org/apache/rocketmq/remoting/common/ServiceThread.java +++ b/remoting/src/main/java/org/apache/rocketmq/remoting/common/ServiceThread.java @@ -73,61 +73,6 @@ public abstract class ServiceThread implements Runnable { return JOIN_TIME; } - public void stop() { - this.stop(false); - } - - public void stop(final boolean interrupt) { - this.stopped = true; - log.info("stop thread " + this.getServiceName() + " interrupt " + interrupt); - synchronized (this) { - if (!this.hasNotified) { - this.hasNotified = true; - this.notify(); - } - } - - if (interrupt) { - this.thread.interrupt(); - } - } - - public void makeStop() { - this.stopped = true; - log.info("makestop thread " + this.getServiceName()); - } - - public void wakeup() { - synchronized (this) { - if (!this.hasNotified) { - this.hasNotified = true; - this.notify(); - } - } - } - - protected void waitForRunning(long interval) { - synchronized (this) { - if (this.hasNotified) { - this.hasNotified = false; - this.onWaitEnd(); - return; - } - - try { - this.wait(interval); - } catch (InterruptedException e) { - log.error("Interrupted", e); - } finally { - this.hasNotified = false; - this.onWaitEnd(); - } - } - } - - protected void onWaitEnd() { - } - public boolean isStopped() { return stopped; }