You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by ta...@apache.org on 2015/01/15 19:44:31 UTC

qpid-jms git commit: Some initial improvements to the discovery agent to prevent unable to bind on some hosts.

Repository: qpid-jms
Updated Branches:
  refs/heads/master 5dd7ca555 -> d08df5c1e


Some initial improvements to the discovery agent to prevent unable to
bind on some hosts.

Project: http://git-wip-us.apache.org/repos/asf/qpid-jms/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-jms/commit/d08df5c1
Tree: http://git-wip-us.apache.org/repos/asf/qpid-jms/tree/d08df5c1
Diff: http://git-wip-us.apache.org/repos/asf/qpid-jms/diff/d08df5c1

Branch: refs/heads/master
Commit: d08df5c1e4ca0fbfe6c7ec7b240142deb462777d
Parents: 5dd7ca5
Author: Timothy Bish <ta...@gmail.com>
Authored: Thu Jan 15 13:44:21 2015 -0500
Committer: Timothy Bish <ta...@gmail.com>
Committed: Thu Jan 15 13:44:21 2015 -0500

----------------------------------------------------------------------
 .../multicast/MulticastDiscoveryAgent.java      | 49 ++++++++++++++++++++
 1 file changed, 49 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-jms/blob/d08df5c1/qpid-jms-discovery/src/main/java/org/apache/qpid/jms/provider/discovery/multicast/MulticastDiscoveryAgent.java
----------------------------------------------------------------------
diff --git a/qpid-jms-discovery/src/main/java/org/apache/qpid/jms/provider/discovery/multicast/MulticastDiscoveryAgent.java b/qpid-jms-discovery/src/main/java/org/apache/qpid/jms/provider/discovery/multicast/MulticastDiscoveryAgent.java
index 96c23cc..cacd1af 100644
--- a/qpid-jms-discovery/src/main/java/org/apache/qpid/jms/provider/discovery/multicast/MulticastDiscoveryAgent.java
+++ b/qpid-jms-discovery/src/main/java/org/apache/qpid/jms/provider/discovery/multicast/MulticastDiscoveryAgent.java
@@ -20,13 +20,19 @@ import java.io.IOException;
 import java.net.DatagramPacket;
 import java.net.InetAddress;
 import java.net.InetSocketAddress;
+import java.net.InterfaceAddress;
 import java.net.MulticastSocket;
 import java.net.NetworkInterface;
 import java.net.SocketAddress;
+import java.net.SocketException;
 import java.net.SocketTimeoutException;
 import java.net.URI;
 import java.net.URISyntaxException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Enumeration;
 import java.util.Iterator;
+import java.util.List;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.atomic.AtomicBoolean;
@@ -144,6 +150,8 @@ public class MulticastDiscoveryAgent implements DiscoveryAgent, Runnable {
             }
             if (mcNetworkInterface != null) {
                 mcast.setNetworkInterface(NetworkInterface.getByName(mcNetworkInterface));
+            } else {
+                trySetNetworkInterface(mcast);
             }
             runner = new Thread(this);
             runner.setName(this.toString() + ":" + runner.getName());
@@ -366,6 +374,47 @@ public class MulticastDiscoveryAgent implements DiscoveryAgent, Runnable {
         this.parser = parser;
     }
 
+    private void trySetNetworkInterface(MulticastSocket mcastSock) throws SocketException {
+        List<NetworkInterface> interfaces = findNetworkInterface();
+        SocketException lastError = null;
+
+        for (NetworkInterface networkInterface : interfaces) {
+            try {
+                mcastSock.setNetworkInterface(networkInterface);
+                break;
+            } catch (SocketException error) {
+                lastError = error;
+            }
+        }
+
+        if (mcastSock.getNetworkInterface() == null) {
+            if (lastError != null) {
+                throw lastError;
+            } else {
+                throw new SocketException("No NetworkInterface available for this socket.");
+            }
+        }
+    }
+
+    private List<NetworkInterface> findNetworkInterface() throws SocketException {
+        Enumeration<NetworkInterface> ifcs = NetworkInterface.getNetworkInterfaces();
+        List<NetworkInterface> interfaces = new ArrayList<NetworkInterface>();
+        while (ifcs.hasMoreElements()) {
+            NetworkInterface ni = ifcs.nextElement();
+            if (ni.supportsMulticast() && ni.isUp()) {
+                for (InterfaceAddress ia : ni.getInterfaceAddresses()) {
+                    if (ia.getAddress() instanceof java.net.Inet4Address &&
+                        !ia.getAddress().isLoopbackAddress() &&
+                        !ni.getDisplayName().startsWith("vnic")) {
+                        interfaces.add(ni);
+                    }
+                }
+            }
+        }
+
+        return interfaces.isEmpty() ? Collections.<NetworkInterface>emptyList() : interfaces;
+    }
+
     // ---------- Discovered Peer Bookkeeping Class ---------------------------//
 
     private static class RemoteBrokerData extends DiscoveryEvent {


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org