Author: andygumbrecht
Date: Thu Sep 6 07:39:07 2012
New Revision: 1381492
URL: http://svn.apache.org/viewvc?rev=1381492&view=rev
Log:
Fix socket thrashing - ServerSocket timeout default should be 0 (wait
indefinitely for client) as 'close' will kill it.
Prevent 'Already bound' messages on quick restart with 'setReuseAddress'.
Allow socket linger on close.
Modified:
openejb/trunk/openejb/server/openejb-client/src/main/java/org/apache/openejb/client/SocketConnectionFactory.java
openejb/trunk/openejb/server/openejb-server/src/main/java/org/apache/openejb/server/ServiceDaemon.java
Modified:
openejb/trunk/openejb/server/openejb-client/src/main/java/org/apache/openejb/client/SocketConnectionFactory.java
URL:
http://svn.apache.org/viewvc/openejb/trunk/openejb/server/openejb-client/src/main/java/org/apache/openejb/client/SocketConnectionFactory.java?rev=1381492&r1=1381491&r2=1381492&view=diff
==============================================================================
---
openejb/trunk/openejb/server/openejb-client/src/main/java/org/apache/openejb/client/SocketConnectionFactory.java
(original)
+++
openejb/trunk/openejb/server/openejb-client/src/main/java/org/apache/openejb/client/SocketConnectionFactory.java
Thu Sep 6 07:39:07 2012
@@ -16,6 +16,12 @@
*/
package org.apache.openejb.client;
+import org.apache.openejb.client.event.ConnectionOpened;
+import org.apache.openejb.client.event.ConnectionPoolCreated;
+import org.apache.openejb.client.event.ConnectionPoolTimeout;
+
+import javax.net.ssl.SSLSocket;
+import javax.net.ssl.SSLSocketFactory;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.IOException;
@@ -35,13 +41,6 @@ import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
-import javax.net.ssl.SSLSocket;
-import javax.net.ssl.SSLSocketFactory;
-
-import org.apache.openejb.client.event.ConnectionOpened;
-import org.apache.openejb.client.event.ConnectionPoolCreated;
-import org.apache.openejb.client.event.ConnectionPoolTimeout;
-
public class SocketConnectionFactory implements ConnectionFactory {
private KeepAliveStyle keepAliveStyle = KeepAliveStyle.PING;
@@ -76,13 +75,13 @@ public class SocketConnectionFactory imp
//Ignore
}
}
-
- private String[] getEnabledCipherSuites(){
+
+ private String[] getEnabledCipherSuites() {
String property = System.getProperty(ENABLED_CIPHER_SUITES);
- if (property != null){
+ if (property != null) {
return property.split(",");
} else {
- return new String[]{ "SSL_DH_anon_WITH_RC4_128_MD5"};
+ return new String[]{"SSL_DH_anon_WITH_RC4_128_MD5"};
}
}
@@ -253,15 +252,18 @@ public class SocketConnectionFactory imp
try {
if (uri.getScheme().equalsIgnoreCase("ejbds")) {
- final SSLSocket sslSocket = (SSLSocket)
SSLSocketFactory.getDefault().createSocket(address.getAddress(),
SocketConnectionFactory.this.timeoutSocket);
+ final SSLSocket sslSocket = (SSLSocket)
SSLSocketFactory.getDefault().createSocket();
sslSocket.setEnabledCipherSuites(enabledCipherSuites);
this.socket = sslSocket;
+
} else {
this.socket = new Socket();
- this.socket.connect(address,
SocketConnectionFactory.this.timeoutSocket);
}
this.socket.setTcpNoDelay(true);
+ this.socket.setSoLinger(true, 10);
+ this.socket.connect(address,
SocketConnectionFactory.this.timeoutSocket);
+
Client.fireEvent(new ConnectionOpened(uri));
} catch (ConnectException e) {
Modified:
openejb/trunk/openejb/server/openejb-server/src/main/java/org/apache/openejb/server/ServiceDaemon.java
URL:
http://svn.apache.org/viewvc/openejb/trunk/openejb/server/openejb-server/src/main/java/org/apache/openejb/server/ServiceDaemon.java?rev=1381492&r1=1381491&r2=1381492&view=diff
==============================================================================
---
openejb/trunk/openejb/server/openejb-server/src/main/java/org/apache/openejb/server/ServiceDaemon.java
(original)
+++
openejb/trunk/openejb/server/openejb-server/src/main/java/org/apache/openejb/server/ServiceDaemon.java
Thu Sep 6 07:39:07 2012
@@ -30,6 +30,7 @@ import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
+import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;
@@ -44,6 +45,7 @@ import java.util.concurrent.atomic.Atomi
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
+@SuppressWarnings("UnusedDeclaration")
@Managed
public class ServiceDaemon implements ServerService {
@@ -54,7 +56,7 @@ public class ServiceDaemon implements Se
private SocketListener socketListener;
- private int timeout = 1000;
+ private int timeout = 0;
private InetAddress inetAddress;
@@ -68,7 +70,7 @@ public class ServiceDaemon implements Se
private StringTemplate discoveryUriFormat;
private URI serviceUri;
private Properties props;
- private String[] enabledCipherSuites;
+ private String[] enabledCipherSuites;
public ServiceDaemon(ServerService next) {
this.next = next;
@@ -122,7 +124,7 @@ public class ServiceDaemon implements Se
secure = options.get("secure", false);
timeout = options.get("timeout", timeout);
-
+
enabledCipherSuites = options.get("enabledCipherSuites",
"SSL_DH_anon_WITH_RC4_128_MD5").split(",");
next.init(props);
@@ -145,11 +147,14 @@ public class ServiceDaemon implements Se
serverSocket = factory.createServerSocket(port, backlog,
inetAddress);
((SSLServerSocket)
serverSocket).setEnabledCipherSuites(enabledCipherSuites);
} else {
- serverSocket = new ServerSocket(port, backlog,
inetAddress);
+ serverSocket = new ServerSocket();
+ serverSocket.setReuseAddress(true);
+ serverSocket.bind(new InetSocketAddress(inetAddress,
port), backlog);
}
- port = serverSocket.getLocalPort();
serverSocket.setSoTimeout(timeout);
+ port = serverSocket.getLocalPort();
+
} catch (Exception e) {
throw new ServiceException("Service failed to open socket", e);
}
@@ -288,6 +293,7 @@ public class ServiceDaemon implements Se
Socket socket = null;
try {
socket = serverSocket.accept();
+ socket.setSoLinger(true, 10);
socket.setTcpNoDelay(true);
if (socket.isClosed()) {
@@ -310,8 +316,7 @@ public class ServiceDaemon implements Se
// It's up to the consumer of the socket
// to close it.
} catch (SocketTimeoutException e) {
- // we don't really care
- // log.debug("Socket timed-out",e);
+ // Ignore - Should not get here on
serverSocket.setSoTimeout(0)
} catch (SocketException e) {
if (!stop.get()) {
log.debug("Socket error", e);