diff --git a/activemq-core/src/main/java/org/apache/activemq/broker/BrokerService.java b/activemq-core/src/main/java/org/apache/activemq/broker/BrokerService.java index 006d65bf85..230f5b1cb7 100644 --- a/activemq-core/src/main/java/org/apache/activemq/broker/BrokerService.java +++ b/activemq-core/src/main/java/org/apache/activemq/broker/BrokerService.java @@ -197,7 +197,7 @@ public class BrokerService implements Service { static { String localHostName = "localhost"; try { - localHostName = java.net.InetAddress.getLocalHost().getHostName(); + localHostName = InetAddressUtil.getLocalHostName(); } catch (UnknownHostException e) { LOG.error("Failed to resolve localhost"); } diff --git a/activemq-core/src/main/java/org/apache/activemq/broker/region/RegionBroker.java b/activemq-core/src/main/java/org/apache/activemq/broker/region/RegionBroker.java index 213af6814b..f8aacaac72 100755 --- a/activemq-core/src/main/java/org/apache/activemq/broker/region/RegionBroker.java +++ b/activemq-core/src/main/java/org/apache/activemq/broker/region/RegionBroker.java @@ -64,6 +64,7 @@ import org.apache.activemq.thread.TaskRunnerFactory; import org.apache.activemq.usage.SystemUsage; import org.apache.activemq.util.BrokerSupport; import org.apache.activemq.util.IdGenerator; +import org.apache.activemq.util.InetAddressUtil; import org.apache.activemq.util.LongSequenceGenerator; import org.apache.activemq.util.ServiceStopper; import org.apache.commons.logging.Log; @@ -615,7 +616,7 @@ public class RegionBroker extends EmptyBroker { public String getBrokerName() { if (brokerName == null) { try { - brokerName = java.net.InetAddress.getLocalHost().getHostName().toLowerCase(); + brokerName = InetAddressUtil.getLocalHostName().toLowerCase(); } catch (Exception e) { brokerName = "localhost"; } diff --git a/activemq-core/src/main/java/org/apache/activemq/transport/tcp/TcpTransport.java b/activemq-core/src/main/java/org/apache/activemq/transport/tcp/TcpTransport.java index 974d83d0b8..fca1ff37ad 100755 --- a/activemq-core/src/main/java/org/apache/activemq/transport/tcp/TcpTransport.java +++ b/activemq-core/src/main/java/org/apache/activemq/transport/tcp/TcpTransport.java @@ -40,6 +40,7 @@ import org.apache.activemq.Service; import org.apache.activemq.transport.Transport; import org.apache.activemq.transport.TransportLoggerFactory; import org.apache.activemq.transport.TransportThreadSupport; +import org.apache.activemq.util.InetAddressUtil; import org.apache.activemq.util.IntrospectionSupport; import org.apache.activemq.util.ServiceStopper; import org.apache.activemq.wireformat.WireFormat; @@ -400,7 +401,7 @@ public class TcpTransport extends TransportThreadSupport implements Transport, S // ------------------------------------------------------------------------- protected String resolveHostName(String host) throws UnknownHostException { if (isUseLocalHost()) { - String localName = InetAddress.getLocalHost().getHostName(); + String localName = InetAddressUtil.getLocalHostName(); if (localName != null && localName.equals(host)) { return "localhost"; } diff --git a/activemq-core/src/main/java/org/apache/activemq/transport/tcp/TcpTransportServer.java b/activemq-core/src/main/java/org/apache/activemq/transport/tcp/TcpTransportServer.java index 4fc61b65e6..8a3e249974 100755 --- a/activemq-core/src/main/java/org/apache/activemq/transport/tcp/TcpTransportServer.java +++ b/activemq-core/src/main/java/org/apache/activemq/transport/tcp/TcpTransportServer.java @@ -43,6 +43,7 @@ import org.apache.activemq.transport.TransportLoggerFactory; import org.apache.activemq.transport.TransportServer; import org.apache.activemq.transport.TransportServerThreadSupport; import org.apache.activemq.util.IOExceptionSupport; +import org.apache.activemq.util.InetAddressUtil; import org.apache.activemq.util.IntrospectionSupport; import org.apache.activemq.util.ServiceListener; import org.apache.activemq.util.ServiceStopper; @@ -332,7 +333,7 @@ public class TcpTransportServer extends TransportServerThreadSupport implements if (socket.isBound()) { if (socket.getInetAddress().isAnyLocalAddress()) { // make it more human readable and useful, an alternative to 0.0.0.0 - result = InetAddress.getLocalHost().getHostName(); + result = InetAddressUtil.getLocalHostName(); } else { result = socket.getInetAddress().getCanonicalHostName(); } diff --git a/activemq-core/src/main/java/org/apache/activemq/transport/udp/UdpTransport.java b/activemq-core/src/main/java/org/apache/activemq/transport/udp/UdpTransport.java index c98a76b9b3..e7664f74e0 100755 --- a/activemq-core/src/main/java/org/apache/activemq/transport/udp/UdpTransport.java +++ b/activemq-core/src/main/java/org/apache/activemq/transport/udp/UdpTransport.java @@ -39,6 +39,7 @@ import org.apache.activemq.transport.reliable.ExceptionIfDroppedReplayStrategy; import org.apache.activemq.transport.reliable.ReplayBuffer; import org.apache.activemq.transport.reliable.ReplayStrategy; import org.apache.activemq.transport.reliable.Replayer; +import org.apache.activemq.util.InetAddressUtil; import org.apache.activemq.util.IntSequenceGenerator; import org.apache.activemq.util.ServiceStopper; import org.apache.commons.logging.Log; @@ -340,7 +341,7 @@ public class UdpTransport extends TransportThreadSupport implements Transport, S } protected String resolveHostName(String host) throws UnknownHostException { - String localName = InetAddress.getLocalHost().getHostName(); + String localName = InetAddressUtil.getLocalHostName(); if (localName != null && isUseLocalHost()) { if (localName.equals(host)) { return "localhost"; diff --git a/activemq-core/src/main/java/org/apache/activemq/util/IdGenerator.java b/activemq-core/src/main/java/org/apache/activemq/util/IdGenerator.java index cf2ae6d531..79ff3511da 100755 --- a/activemq-core/src/main/java/org/apache/activemq/util/IdGenerator.java +++ b/activemq-core/src/main/java/org/apache/activemq/util/IdGenerator.java @@ -16,7 +16,6 @@ */ package org.apache.activemq.util; -import java.net.InetAddress; import java.net.ServerSocket; import java.util.concurrent.atomic.AtomicLong; @@ -51,7 +50,7 @@ public class IdGenerator { if (canAccessSystemProps) { try { - hostName = InetAddress.getLocalHost().getHostName(); + hostName = InetAddressUtil.getLocalHostName(); ServerSocket ss = new ServerSocket(0); stub = "-" + ss.getLocalPort() + "-" + System.currentTimeMillis() + "-"; Thread.sleep(100); diff --git a/activemq-core/src/main/java/org/apache/activemq/util/InetAddressUtil.java b/activemq-core/src/main/java/org/apache/activemq/util/InetAddressUtil.java new file mode 100644 index 0000000000..a55131aec2 --- /dev/null +++ b/activemq-core/src/main/java/org/apache/activemq/util/InetAddressUtil.java @@ -0,0 +1,41 @@ +package org.apache.activemq.util; + +import java.net.InetAddress; +import java.net.UnknownHostException; + +public class InetAddressUtil { + + /** + * When using the {@link java.net.InetAddress#getHostName()} method in an + * environment where neither a proper DNS lookup nor an /etc/hosts + * entry exists for a given host, the following exception will be thrown: + * + * java.net.UnknownHostException: <hostname>: <hostname> + * at java.net.InetAddress.getLocalHost(InetAddress.java:1425) + * ... + * + * Instead of just throwing an UnknownHostException and giving up, this + * method grabs a suitable hostname from the exception and prevents the + * exception from being thrown. If a suitable hostname cannot be acquired + * from the exception, only then is the UnknownHostException thrown. + * + * @return The hostname + * @throws UnknownHostException + * @see {@link java.net.InetAddress#getLocalHost()} + * @see {@link java.net.InetAddress#getHostName()} + */ + public static String getLocalHostName() throws UnknownHostException { + try { + return (InetAddress.getLocalHost()).getHostName(); + } catch (UnknownHostException uhe) { + String host = uhe.getMessage(); // host = "hostname: hostname" + if (host != null) { + int colon = host.indexOf(':'); + if (colon > 0) { + return host.substring(0, colon); + } + } + throw uhe; + } + } +}