Author: chirino
Date: Fri Jun 30 16:06:54 2006
New Revision: 418413

URL: http://svn.apache.org/viewvc?rev=418413&view=rev
Log:
http://issues.apache.org/activemq/browse/AMQ-787

Modified:
    
incubator/activemq/trunk/activemq-core/src/main/java/org/apache/activemq/transport/udp/UdpTransport.java

Modified: 
incubator/activemq/trunk/activemq-core/src/main/java/org/apache/activemq/transport/udp/UdpTransport.java
URL: 
http://svn.apache.org/viewvc/incubator/activemq/trunk/activemq-core/src/main/java/org/apache/activemq/transport/udp/UdpTransport.java?rev=418413&r1=418412&r2=418413&view=diff
==============================================================================
--- 
incubator/activemq/trunk/activemq-core/src/main/java/org/apache/activemq/transport/udp/UdpTransport.java
 (original)
+++ 
incubator/activemq/trunk/activemq-core/src/main/java/org/apache/activemq/transport/udp/UdpTransport.java
 Fri Jun 30 16:06:54 2006
@@ -33,6 +33,7 @@
 
 import java.io.EOFException;
 import java.io.IOException;
+import java.net.BindException;
 import java.net.DatagramSocket;
 import java.net.InetAddress;
 import java.net.InetSocketAddress;
@@ -51,6 +52,9 @@
 public class UdpTransport extends TransportThreadSupport implements Transport, 
Service, Runnable {
     private static final Log log = LogFactory.getLog(UdpTransport.class);
 
+       private static final int MAX_BIND_ATTEMPTS = 50;
+       private static final long BIND_ATTEMPT_DELAY = 100;
+
     private CommandChannel commandChannel;
     private OpenWireFormat wireFormat;
     private ByteBufferPool bufferPool;
@@ -387,7 +391,26 @@
         if (log.isDebugEnabled()) {
             log.debug("Binding to address: " + localAddress);
         }
-        socket.bind(localAddress);
+        
+        //
+        // We have noticed that on some platfoms like linux, after you close 
down
+        // a previously bound socket, it can take a little while before we can 
bind it again.
+        // 
+        for(int i=0; i < MAX_BIND_ATTEMPTS; i++){
+                       try {
+                               socket.bind(localAddress);
+                               return;
+                       } catch (BindException e) {
+                               if ( i+1 == MAX_BIND_ATTEMPTS )
+                                       throw e;
+                               try {
+                                       Thread.sleep(BIND_ATTEMPT_DELAY);
+                               } catch (InterruptedException e1) {
+                                       throw e;
+                               }
+                       }                       
+       }
+
     }
 
     protected DatagramChannel connect(DatagramChannel channel, SocketAddress 
targetAddress2) throws IOException {


Reply via email to