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

Reply via email to