User: starksm
Date: 01/11/27 22:23:03
Modified: src/main/org/jboss/ejb/plugins/local Tag: Branch_2_4
BaseLocalContainerInvoker.java
Log:
As noted in SF Bug#482875, the WeakHashMap usage is not actually allowing
classes to be garbage collected due to Methods retaining strong references
to their Class. Since the container invokers have a well defined life-cycle
its better to explicitly remove the cached methods hashes in the invoker
stop method.
Revision Changes Path
No revision
No revision
1.6.2.2 +28 -17
jboss/src/main/org/jboss/ejb/plugins/local/BaseLocalContainerInvoker.java
Index: BaseLocalContainerInvoker.java
===================================================================
RCS file:
/cvsroot/jboss/jboss/src/main/org/jboss/ejb/plugins/local/BaseLocalContainerInvoker.java,v
retrieving revision 1.6.2.1
retrieving revision 1.6.2.2
diff -u -r1.6.2.1 -r1.6.2.2
--- BaseLocalContainerInvoker.java 2001/11/02 08:42:36 1.6.2.1
+++ BaseLocalContainerInvoker.java 2001/11/28 06:23:03 1.6.2.2
@@ -41,35 +41,32 @@
import javax.transaction.Transaction;
import javax.transaction.TransactionManager;
-import org.jboss.ejb.MethodInvocation;
-import org.jboss.ejb.plugins.jrmp.interfaces.RemoteMethodInvocation;
-
+import org.jboss.deployment.DeploymentException;
+import org.jboss.ejb.CacheKey;
import org.jboss.ejb.Container;
import org.jboss.ejb.ContainerInvokerContainer;
import org.jboss.ejb.Interceptor;
import org.jboss.ejb.LocalContainerInvoker;
+import org.jboss.ejb.MethodInvocation;
import org.jboss.ejb.plugins.jrmp.interfaces.EJBMetaDataImpl;
-import org.jboss.ejb.CacheKey;
-
-import org.jboss.tm.TransactionPropagationContextFactory;
-
-import org.jboss.security.SecurityAssociation;
-
+import org.jboss.ejb.plugins.jrmp.interfaces.RemoteMethodInvocation;
import org.jboss.logging.Logger;
-
-import org.jboss.deployment.DeploymentException;
import org.jboss.metadata.MetaData;
import org.jboss.metadata.EntityMetaData;
import org.jboss.metadata.SessionMetaData;
+import org.jboss.security.SecurityAssociation;
+import org.jboss.tm.TransactionPropagationContextFactory;
/**
* <description>
*
- * @author Daniel OConnor ([EMAIL PROTECTED])
+ * @author Daniel OConnor ([EMAIL PROTECTED])
+ * @author [EMAIL PROTECTED]
*/
public class BaseLocalContainerInvoker implements LocalContainerInvoker
{
+ static Logger log = Logger.getLogger(BaseLocalContainerInvoker.class);
// Attributes ----------------------------------------------------
protected Container container;
protected String jndiName;
@@ -103,9 +100,10 @@
}
public void init()
- throws Exception
+ throws Exception
{
- if (((ContainerInvokerContainer)container).getLocalClass() == null)
+ ContainerInvokerContainer invokerContainer = (ContainerInvokerContainer)
container;
+ if (invokerContainer.getLocalClass() == null)
return;
Context ctx = new InitialContext();
@@ -117,19 +115,19 @@
transactionManager =
((TransactionManager)ctx.lookup("java:/TransactionManager"));
// Create method mappings for container invoker
- Method[] methods =
((ContainerInvokerContainer)container).getLocalClass().getMethods();
+ Method[] methods = invokerContainer.getLocalClass().getMethods();
beanMethodInvokerMap = new HashMap();
for (int i = 0; i < methods.length; i++)
beanMethodInvokerMap.put(new
Long(RemoteMethodInvocation.calculateHash(methods[i])), methods[i]);
- methods =
((ContainerInvokerContainer)container).getLocalHomeClass().getMethods();
+ methods = invokerContainer.getLocalHomeClass().getMethods();
homeMethodInvokerMap = new HashMap();
for (int i = 0; i < methods.length; i++)
homeMethodInvokerMap.put(new
Long(RemoteMethodInvocation.calculateHash(methods[i])), methods[i]);
}
public void start()
- throws Exception
+ throws Exception
{
// put in the static hashmap
}
@@ -137,6 +135,19 @@
public void stop()
{
// remove from the static hashmap
+ beanMethodInvokerMap.clear();
+ homeMethodInvokerMap.clear();
+ // Remove method mappings for container invoker
+ ContainerInvokerContainer invokerContainer = (ContainerInvokerContainer)
container;
+ Method[] methods = invokerContainer.getRemoteClass().getMethods();
+ for (int i = 0; i < methods.length; i++)
+ RemoteMethodInvocation.clearHash(methods[i]);
+
+ methods = invokerContainer.getHomeClass().getMethods();
+ for (int i = 0; i < methods.length; i++)
+ RemoteMethodInvocation.clearHash(methods[i]);
+
+ log.debug("Cleared method maps");
}
public void destroy()
_______________________________________________
Jboss-development mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/jboss-development