Author: andygumbrecht
Date: Mon Sep 26 09:09:56 2011
New Revision: 1175732
URL: http://svn.apache.org/viewvc?rev=1175732&view=rev
Log:
Fix: InputStream was not being explicitly closed - Socket close.
Removed per request debug/error String declaration.
Ensure streams are closed at all levels as read/writeExternal may fail.
Modified:
openejb/trunk/openejb3/server/openejb-ejbd/src/main/java/org/apache/openejb/server/ejbd/EjbDaemon.java
Modified:
openejb/trunk/openejb3/server/openejb-ejbd/src/main/java/org/apache/openejb/server/ejbd/EjbDaemon.java
URL:
http://svn.apache.org/viewvc/openejb/trunk/openejb3/server/openejb-ejbd/src/main/java/org/apache/openejb/server/ejbd/EjbDaemon.java?rev=1175732&r1=1175731&r2=1175732&view=diff
==============================================================================
---
openejb/trunk/openejb3/server/openejb-ejbd/src/main/java/org/apache/openejb/server/ejbd/EjbDaemon.java
(original)
+++
openejb/trunk/openejb3/server/openejb-ejbd/src/main/java/org/apache/openejb/server/ejbd/EjbDaemon.java
Mon Sep 26 09:09:56 2011
@@ -16,29 +16,21 @@
*/
package org.apache.openejb.server.ejbd;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-import java.io.OutputStream;
-import java.net.Socket;
-import java.rmi.RemoteException;
-import java.util.Properties;
-
import org.apache.openejb.BeanContext;
import org.apache.openejb.ProxyInfo;
-import org.apache.openejb.server.DiscoveryAgent;
+import org.apache.openejb.client.*;
import org.apache.openejb.loader.SystemInstance;
+import org.apache.openejb.server.DiscoveryAgent;
import org.apache.openejb.spi.ContainerSystem;
-import org.apache.openejb.client.EJBRequest;
-import org.apache.openejb.client.RequestMethodConstants;
-import org.apache.openejb.client.EjbObjectInputStream;
-import org.apache.openejb.client.ProtocolMetaData;
-import org.apache.openejb.client.ServerMetaData;
import org.apache.openejb.util.LogCategory;
import org.apache.openejb.util.Logger;
import org.apache.openejb.util.Messages;
+import java.io.*;
+import java.net.Socket;
+import java.rmi.RemoteException;
+import java.util.Properties;
+
public class EjbDaemon implements org.apache.openejb.spi.ApplicationServer {
private static final ProtocolMetaData PROTOCOL_VERSION = new
ProtocolMetaData("3.1");
@@ -47,7 +39,7 @@ public class EjbDaemon implements org.ap
static final Logger logger =
Logger.getInstance(LogCategory.OPENEJB_SERVER_REMOTE,
"org.apache.openejb.server.util.resources");
private ClientObjectFactory clientObjectFactory;
-// DeploymentIndex deploymentIndex;
+ // DeploymentIndex deploymentIndex;
private EjbRequestHandler ejbHandler;
private JndiRequestHandler jndiHandler;
private AuthRequestHandler authHandler;
@@ -55,17 +47,17 @@ public class EjbDaemon implements org.ap
boolean stop = false;
- static EjbDaemon thiss;
+ static EjbDaemon instance;
private ContainerSystem containerSystem;
private EjbDaemon() {
}
public static EjbDaemon getEjbDaemon() {
- if (thiss == null) {
- thiss = new EjbDaemon();
+ if (instance == null) {
+ instance = new EjbDaemon();
}
- return thiss;
+ return instance;
}
public void init(Properties props) throws Exception {
@@ -92,44 +84,69 @@ public class EjbDaemon implements org.ap
try {
service(in, out);
} finally {
- try {
- if (socket != null) socket.close();
- } catch (Throwable t) {
- logger.error("Encountered problem while closing connection
with client: " + t.getMessage());
+
+ if (null != out) {
+
+ try {
+ out.flush();
+ } catch (Throwable e) {
+ //Ignore
+ }
+
+ try {
+ out.close();
+ } catch (Throwable e) {
+ //Ignore
+ }
+ }
+
+ if (null != in) {
+ try {
+ in.close();
+ } catch (Throwable e) {
+ //Ignore
+ }
+ }
+
+ if (null != socket) {
+ try {
+ socket.close();
+ } catch (Throwable t) {
+ logger.error("Error closing client connection: " +
t.getMessage());
+ }
}
}
}
public void service(InputStream in, OutputStream out) throws IOException {
ProtocolMetaData protocolMetaData = new ProtocolMetaData();
- String requestTypeName = null;
ObjectInputStream ois = null;
ObjectOutputStream oos = null;
+ byte requestType = -1;
try {
// Read Protocol Version
protocolMetaData.readExternal(in);
-
PROTOCOL_VERSION.writeExternal(out);
ois = new EjbObjectInputStream(in);
oos = new ObjectOutputStream(out);
// Read ServerMetaData
- ServerMetaData serverMetaData = new ServerMetaData();
+ final ServerMetaData serverMetaData = new ServerMetaData();
serverMetaData.readExternal(ois);
ClientObjectFactory.serverMetaData.set(serverMetaData);
// Read request type
- byte requestType = (byte) ois.read();
+ requestType = (byte) ois.read();
if (requestType == -1) {
return;
}
- if (requestType == RequestMethodConstants.CLUSTER_REQUEST){
+ if (requestType == RequestMethodConstants.CLUSTER_REQUEST) {
processClusterRequest(ois, oos);
}
@@ -139,48 +156,69 @@ public class EjbDaemon implements org.ap
return;
}
-
// Exceptions should not be thrown from these methods
// They should handle their own exceptions and clean
// things up with the client accordingly.
switch (requestType) {
case RequestMethodConstants.EJB_REQUEST:
- requestTypeName = "EJB_REQUEST";
processEjbRequest(ois, oos);
break;
case RequestMethodConstants.JNDI_REQUEST:
- requestTypeName = "JNDI_REQUEST";
processJndiRequest(ois, oos);
break;
case RequestMethodConstants.AUTH_REQUEST:
- requestTypeName = "AUTH_REQUEST";
processAuthRequest(ois, oos);
break;
default:
- requestTypeName = requestType+" (UNKNOWN)";
- logger.error("\"" + requestTypeName + " " +
protocolMetaData.getSpec() + "\" FAIL \"Unknown request type " + requestType);
-
+ logger.error("\"" + getTypeName(requestType) + " " +
protocolMetaData.getSpec() + "\" FAIL \"Unknown request type " + requestType);
+ break;
}
} catch (SecurityException e) {
- logger.error("\""+requestTypeName +" "+ protocolMetaData.getSpec()
+ "\" FAIL \"Security error - "+e.getMessage()+"\"",e);
+ logger.error("\"" + getTypeName(requestType) + " " +
protocolMetaData.getSpec() + "\" FAIL \"Security error - " + e.getMessage() +
"\"", e);
} catch (Throwable e) {
- logger.error("\""+requestTypeName +" "+ protocolMetaData.getSpec()
+ "\" FAIL \"Unexpected error - "+e.getMessage()+"\"",e);
+ logger.error("\"" + getTypeName(requestType) + " " +
protocolMetaData.getSpec() + "\" FAIL \"Unexpected error - " + e.getMessage() +
"\"", e);
} finally {
+
ClientObjectFactory.serverMetaData.remove();
- try {
- if (oos != null) {
+
+ if (null != oos) {
+
+ try {
oos.flush();
+ } catch (Throwable e) {
+ //Ignore
+ }
+
+ try {
oos.close();
- } else if (out != null) {
- out.flush();
- out.close();
+ } catch (Throwable e) {
+ //Ignore
+ }
+ }
+
+ if (null != ois) {
+ try {
+ ois.close();
+ } catch (Throwable e) {
+ //Ignore
}
- } catch (Throwable t) {
- logger.error("\""+requestTypeName +" "+
protocolMetaData.getSpec() + "\" FAIL \""+t.getMessage()+"\"");
}
}
}
+ private static String getTypeName(final byte requestType) {
+ switch (requestType) {
+ case RequestMethodConstants.EJB_REQUEST:
+ return "EJB_REQUEST";
+ case RequestMethodConstants.JNDI_REQUEST:
+ return "JNDI_REQUEST";
+ case RequestMethodConstants.AUTH_REQUEST:
+ return "AUTH_REQUEST";
+ default:
+ return requestType + " (UNKNOWN)";
+ }
+ }
+
private void processClusterRequest(ObjectInputStream in,
ObjectOutputStream out) throws IOException {
clusterHandler.processRequest(in, out);
}
@@ -188,7 +226,7 @@ public class EjbDaemon implements org.ap
protected BeanContext getDeployment(EJBRequest req) throws RemoteException
{
String deploymentId = req.getDeploymentId();
BeanContext beanContext = containerSystem.getBeanContext(deploymentId);
- if (beanContext == null) throw new RemoteException("No deployment:
"+deploymentId);
+ if (beanContext == null) throw new RemoteException("No deployment: " +
deploymentId);
return beanContext;
}