You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by dj...@apache.org on 2010/08/19 19:46:46 UTC

svn commit: r987247 - in /openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core: CoreDeploymentInfo.java singleton/SingletonInstanceManager.java

Author: djencks
Date: Thu Aug 19 17:46:46 2010
New Revision: 987247

URL: http://svn.apache.org/viewvc?rev=987247&view=rev
Log:
OPENEJB-1164 tx for singleton @PreDestroy/@PostConstruct methods. Derived partly from patch by Gurkan

Modified:
    openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/CoreDeploymentInfo.java
    openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/singleton/SingletonInstanceManager.java

Modified: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/CoreDeploymentInfo.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/CoreDeploymentInfo.java?rev=987247&r1=987246&r2=987247&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/CoreDeploymentInfo.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/CoreDeploymentInfo.java Thu Aug 19 17:46:46 2010
@@ -53,6 +53,8 @@ import org.apache.openejb.core.intercept
 import org.apache.openejb.core.interceptor.InterceptorStack;
 import org.apache.openejb.core.ivm.EjbHomeProxyHandler;
 import org.apache.openejb.core.timer.EjbTimerService;
+import org.apache.openejb.core.transaction.EjbTransactionUtil;
+import org.apache.openejb.core.transaction.TransactionPolicy;
 import org.apache.openejb.core.transaction.TransactionPolicyFactory;
 import org.apache.openejb.core.transaction.TransactionType;
 import org.apache.openejb.util.Duration;
@@ -704,6 +706,7 @@ public class CoreDeploymentInfo extends 
     }
 
     public void setCallbackInterceptors(List<InterceptorData> callbackInterceptors) {
+        //TODO shouldn't we remove the old callbackInterceptors from instanceScopedInterceptors before adding the new ones?
         this.callbackInterceptors.clear();
         this.callbackInterceptors.addAll(callbackInterceptors);
         this.instanceScopedInterceptors.addAll(callbackInterceptors);
@@ -1090,11 +1093,38 @@ public class CoreDeploymentInfo extends 
             callContext.setCurrentOperation(Operation.POST_CONSTRUCT);
             final List<InterceptorData> callbackInterceptors = this.getCallbackInterceptors();
             final InterceptorStack postConstruct = new InterceptorStack(bean, null, Operation.POST_CONSTRUCT, callbackInterceptors, interceptorInstances);
-            postConstruct.invoke();
+            
+            //Transaction Demarcation for Singleton PostConstruct method
+            TransactionType transactionType;
+
+            if (getComponentType() == BeanType.SINGLETON) {
+                List<Method> callbacks = callbackInterceptors.get(callbackInterceptors.size() -1).getPostConstruct();
+                if (callbacks.isEmpty()) {
+                    transactionType = TransactionType.RequiresNew;
+                } else {
+                    transactionType = getTransactionType(callbacks.get(0));
+                    if (transactionType == TransactionType.Required) {
+                        transactionType = TransactionType.RequiresNew;
+                    }
+                }
+            } else {
+                transactionType = isBeanManagedTransaction()? TransactionType.BeanManaged: TransactionType.NotSupported;
+            }
+            TransactionPolicy transactionPolicy = EjbTransactionUtil.createTransactionPolicy(transactionType, callContext);
+            try{
+                //Call the chain
+                postConstruct.invoke();                
+            } catch(Throwable e) {
+                //RollBack Transaction
+                EjbTransactionUtil.handleSystemException(transactionPolicy, e, callContext);
+            }
+            finally{
+                EjbTransactionUtil.afterInvoke(transactionPolicy, callContext);
+            }
 
             return new InstanceContext(this, bean, interceptorInstances);
         } finally {
             ThreadContext.exit(oldContext);
-        }
+        }                        
     }
 }

Modified: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/singleton/SingletonInstanceManager.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/singleton/SingletonInstanceManager.java?rev=987247&r1=987246&r2=987247&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/singleton/SingletonInstanceManager.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/singleton/SingletonInstanceManager.java Thu Aug 19 17:46:46 2010
@@ -41,8 +41,10 @@ import javax.xml.ws.WebServiceContext;
 import javax.management.MBeanServer;
 import javax.management.ObjectName;
 
+import org.apache.openejb.BeanType;
 import org.apache.openejb.OpenEJBException;
 import org.apache.openejb.ApplicationException;
+import org.apache.openejb.core.transaction.TransactionType;
 import org.apache.openejb.monitoring.StatsInterceptor;
 import org.apache.openejb.monitoring.ObjectNameBuilder;
 import org.apache.openejb.monitoring.ManagedMBean;
@@ -52,6 +54,8 @@ import org.apache.openejb.core.ThreadCon
 import org.apache.openejb.core.InstanceContext;
 import org.apache.openejb.core.interceptor.InterceptorData;
 import org.apache.openejb.core.interceptor.InterceptorStack;
+import org.apache.openejb.core.transaction.EjbTransactionUtil;
+import org.apache.openejb.core.transaction.TransactionPolicy;
 import org.apache.openejb.spi.SecurityService;
 import org.apache.openejb.util.LogCategory;
 import org.apache.openejb.util.Logger;
@@ -189,13 +193,39 @@ public class SingletonInstanceManager {
             List<InterceptorData> callbackInterceptors = deploymentInfo.getCallbackInterceptors();
             InterceptorStack interceptorStack = new InterceptorStack(instance.bean, remove, Operation.PRE_DESTROY, callbackInterceptors, instance.interceptors);
 
-            interceptorStack.invoke();
+            //Transaction Demarcation for Singleton PostConstruct method
+            TransactionType transactionType;
+
+            if (deploymentInfo.getComponentType() == BeanType.SINGLETON) {
+                List<Method> callbacks = callbackInterceptors.get(callbackInterceptors.size() -1).getPreDestroy();
+                if (callbacks.isEmpty()) {
+                    transactionType = TransactionType.RequiresNew;
+                } else {
+                    transactionType = deploymentInfo.getTransactionType(callbacks.get(0));
+                    if (transactionType == TransactionType.Required) {
+                        transactionType = TransactionType.RequiresNew;
+                    }
+                }
+            } else {
+                transactionType = deploymentInfo.isBeanManagedTransaction()? TransactionType.BeanManaged: TransactionType.NotSupported;
+            }
+            TransactionPolicy transactionPolicy = EjbTransactionUtil.createTransactionPolicy(transactionType, callContext);
+            try{
+                //Call the chain
+                interceptorStack.invoke();                
+            } catch(Throwable e) {
+                //RollBack Transaction
+                EjbTransactionUtil.handleSystemException(transactionPolicy, e, callContext);
+            }
+            finally{
+                EjbTransactionUtil.afterInvoke(transactionPolicy, callContext);
+            }
+
         } catch (Throwable re) {
             logger.error("Singleton shutdown failed: "+deploymentInfo.getDeploymentID(), re);
         }
-
     }
-
+    
     /**
      * This method has no work to do as all instances are removed from
      * the pool on getInstance(...) and not returned via poolInstance(...)