[jboss-cvs] JBossAS SVN: r109819 - in projects/ejb3/trunk/core: src/main/java/org/jboss/ejb3 and 5 other directories.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Fri Dec 10 06:23:35 EST 2010


Author: ALRubinger
Date: 2010-12-10 06:23:34 -0500 (Fri, 10 Dec 2010)
New Revision: 109819

Modified:
   projects/ejb3/trunk/core/pom.xml
   projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/EJBContainer.java
   projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/async/impl/interceptor/AsynchronousInterceptorFactory.java
   projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/async/impl/interceptor/AsynchronousServerInterceptor.java
   projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/core/context/SessionInvocationContextAdapter.java
   projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/session/SecurityActions.java
   projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/session/SessionContextDelegateBase.java
   projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/session/SessionSpecContainer.java
   projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/stateful/StatefulContainerInvocation.java
   projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/stateless/StatelessInstanceInterceptor.java
Log:
[EJBTHREE-1721] Async support and Tx handling in core

Modified: projects/ejb3/trunk/core/pom.xml
===================================================================
--- projects/ejb3/trunk/core/pom.xml	2010-12-10 11:07:54 UTC (rev 109818)
+++ projects/ejb3/trunk/core/pom.xml	2010-12-10 11:23:34 UTC (rev 109819)
@@ -56,7 +56,7 @@
 
     <!-- EJB 3.1 stuff -->
     <version.org.jboss.ejb3.concurrency>1.0.0-alpha-3</version.org.jboss.ejb3.concurrency>
-    <version.org.jboss.ejb3.async>1.0.0-alpha-7</version.org.jboss.ejb3.async>
+    <version.org.jboss.ejb3.async>1.0.0-alpha-8-SNAPSHOT</version.org.jboss.ejb3.async>
   </properties>
 
   <!-- Build Information -->

Modified: projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/EJBContainer.java
===================================================================
--- projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/EJBContainer.java	2010-12-10 11:07:54 UTC (rev 109818)
+++ projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/EJBContainer.java	2010-12-10 11:23:34 UTC (rev 109819)
@@ -502,14 +502,15 @@
       if(annotation != null)
          return annotation;
       
+      // An unchecked-exception is only an application exception if annotated (or described) as such.
+      // (see EJB 3.1 FR 14.2.1)
+      if (RuntimeException.class.isAssignableFrom(exceptionType) || Error.class.isAssignableFrom(exceptionType))
+         return null;
+      
       // This feels like a hack around shortcomings in jboss-metadata
       Class[] exceptionTypes = invokedMethod.getExceptionTypes();
       for (Class exceptionClass : exceptionTypes)
       {
-         // An unchecked-exception is only an application exception if annotated (or described) as such.
-         // (see EJB 3.1 FR 14.2.1)
-         if (RuntimeException.class.isAssignableFrom(exceptionType))
-            continue;
          if (exceptionClass.isAssignableFrom(exceptionType))
             return new ApplicationExceptionImpl(false);
       }

Modified: projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/async/impl/interceptor/AsynchronousInterceptorFactory.java
===================================================================
--- projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/async/impl/interceptor/AsynchronousInterceptorFactory.java	2010-12-10 11:07:54 UTC (rev 109818)
+++ projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/async/impl/interceptor/AsynchronousInterceptorFactory.java	2010-12-10 11:23:34 UTC (rev 109819)
@@ -15,7 +15,7 @@
  * 
  * @author <a href="mailto:andrew.rubinger at jboss.org">ALR</a>
  */
-public class AsynchronousInterceptorFactory extends CreatePerClassAspectFactory
+public final class AsynchronousInterceptorFactory extends CreatePerClassAspectFactory
 {
 
    // --------------------------------------------------------------------------------||

Modified: projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/async/impl/interceptor/AsynchronousServerInterceptor.java
===================================================================
--- projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/async/impl/interceptor/AsynchronousServerInterceptor.java	2010-12-10 11:07:54 UTC (rev 109818)
+++ projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/async/impl/interceptor/AsynchronousServerInterceptor.java	2010-12-10 11:23:34 UTC (rev 109819)
@@ -36,6 +36,7 @@
 import org.jboss.ejb3.async.impl.SerializableFuture;
 import org.jboss.ejb3.async.spi.AsyncInvocationId;
 import org.jboss.ejb3.async.spi.AsyncInvocationMap;
+import org.jboss.ejb3.async.spi.CurrentAsyncInvocation;
 import org.jboss.ejb3.mdb.MessagingContainer;
 import org.jboss.ejb3.service.ServiceContainer;
 import org.jboss.ejb3.session.SessionSpecContainer;
@@ -99,7 +100,7 @@
    public Object invoke(final Invocation invocation) throws Throwable
    {
       // Get the current invocation ID
-      final AsyncInvocationId id = CurrentAsyncInvocation.getCurrentAsyncInvocationId(invocation);
+      final AsyncInvocationId id = CurrentAsyncAOPInvocation.getCurrentAsyncInvocationId(invocation);
 
       // Get at the current invocations via the container
       final Advisor advisor = invocation.getAdvisor();

Modified: projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/core/context/SessionInvocationContextAdapter.java
===================================================================
--- projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/core/context/SessionInvocationContextAdapter.java	2010-12-10 11:07:54 UTC (rev 109818)
+++ projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/core/context/SessionInvocationContextAdapter.java	2010-12-10 11:23:34 UTC (rev 109819)
@@ -130,9 +130,9 @@
     * @see org.jboss.ejb3.async.spi.AsyncCancellableContext#cancel(org.jboss.ejb3.async.spi.AsyncInvocationId)
     */
    @Override
-   public void cancel(final AsyncInvocationId id) throws IllegalArgumentException
+   public boolean cancel(final AsyncInvocationId id) throws IllegalArgumentException
    {
       // Delegate
-      container.cancel(id);
+      return container.cancel(id);
    }   
 }

Modified: projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/session/SecurityActions.java
===================================================================
--- projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/session/SecurityActions.java	2010-12-10 11:07:54 UTC (rev 109818)
+++ projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/session/SecurityActions.java	2010-12-10 11:23:34 UTC (rev 109819)
@@ -24,6 +24,9 @@
 import java.security.AccessController;
 import java.security.PrivilegedAction;
 
+import org.jboss.security.SecurityContext;
+import org.jboss.security.SecurityContextAssociation;
+
 /**
  * Privileged Blocks
  * @author Anil.Saldhana at redhat.com
@@ -53,4 +56,15 @@
       }
      });
   }
+  
+  static SecurityContext getSecurityContext()
+  {
+     return AccessController.doPrivileged(new PrivilegedAction<SecurityContext>()
+     {
+        public SecurityContext run()
+        {
+           return SecurityContextAssociation.getSecurityContext();
+        }
+     });
+  }
 }
\ No newline at end of file

Modified: projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/session/SessionContextDelegateBase.java
===================================================================
--- projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/session/SessionContextDelegateBase.java	2010-12-10 11:07:54 UTC (rev 109818)
+++ projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/session/SessionContextDelegateBase.java	2010-12-10 11:23:34 UTC (rev 109819)
@@ -26,9 +26,9 @@
 import javax.xml.rpc.handler.MessageContext;
 
 import org.jboss.ejb3.EJBContextImpl;
-import org.jboss.ejb3.async.impl.interceptor.CurrentAsyncInvocation;
 import org.jboss.ejb3.async.spi.AsyncInvocationId;
 import org.jboss.ejb3.async.spi.AsyncInvocationMap;
+import org.jboss.ejb3.async.spi.CurrentAsyncInvocation;
 import org.jboss.ejb3.context.CurrentInvocationContext;
 import org.jboss.ejb3.context.spi.SessionBeanManager;
 import org.jboss.ejb3.context.spi.SessionContext;

Modified: projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/session/SessionSpecContainer.java
===================================================================
--- projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/session/SessionSpecContainer.java	2010-12-10 11:07:54 UTC (rev 109818)
+++ projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/session/SessionSpecContainer.java	2010-12-10 11:23:34 UTC (rev 109819)
@@ -30,6 +30,7 @@
 import java.util.Hashtable;
 import java.util.Set;
 import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Future;
 
 import javax.ejb.EJBLocalObject;
 import javax.ejb.EJBObject;
@@ -41,10 +42,13 @@
 import org.jboss.aop.util.MethodHashing;
 import org.jboss.beans.metadata.api.annotations.Inject;
 import org.jboss.ejb3.Ejb3Deployment;
+import org.jboss.ejb3.async.impl.AsyncInvocationIdUUIDImpl;
 import org.jboss.ejb3.async.impl.util.concurrent.ResultUnwrappingExecutorService;
-import org.jboss.ejb3.async.spi.AsyncCancellableContext;
+import org.jboss.ejb3.async.spi.AsyncEndpoint;
 import org.jboss.ejb3.async.spi.AsyncInvocationId;
 import org.jboss.ejb3.async.spi.AsyncInvocationMap;
+import org.jboss.ejb3.async.spi.AsyncInvocationTaskBase;
+import org.jboss.ejb3.async.spi.CurrentAsyncInvocation;
 import org.jboss.ejb3.common.lang.SerializableMethod;
 import org.jboss.ejb3.common.registrar.spi.Ejb3RegistrarLocator;
 import org.jboss.ejb3.core.businessobject.BusinessObjectFactory;
@@ -60,6 +64,7 @@
 import org.jboss.ejb3.stateful.StatefulContainerInvocation;
 import org.jboss.logging.Logger;
 import org.jboss.metadata.ejb.jboss.JBossSessionBeanMetaData;
+import org.jboss.security.SecurityContext;
 
 /**
  * SessionSpecContainer
@@ -70,7 +75,7 @@
  * @author <a href="mailto:andrew.rubinger at jboss.org">ALR</a>
  * @version $Revision: $
  */
-public abstract class SessionSpecContainer extends SessionContainer implements InvokableContext, AsyncCancellableContext
+public abstract class SessionSpecContainer extends SessionContainer implements InvokableContext, AsyncEndpoint
 {
 
    // ------------------------------------------------------------------------------||
@@ -78,19 +83,19 @@
    // ------------------------------------------------------------------------------||
 
    private static final Logger log = Logger.getLogger(SessionSpecContainer.class);
-   
+
    /**
     * Business interfaces for this EJB
     */
    private Set<Class<?>> businessInterfaces;
-   
+
    /**
     * {@link ExecutorService} used for EJB 3.1 Async invocations
     */
    private final ExecutorService asynchronousExecutor;
 
    private BusinessObjectFactory businessObjectFactory;
-   
+
    private AsyncInvocationMap currentAsyncInvocations;
 
    // ------------------------------------------------------------------------------||
@@ -108,7 +113,7 @@
       }
       this.asynchronousExecutor = new ResultUnwrappingExecutorService(asynchronousExecutor, this);
    }
-   
+
    public SessionSpecContainer(ClassLoader cl, String beanClassName, String ejbName, Domain domain,
          Hashtable ctxProperties, JBossSessionBeanMetaData beanMetaData, final ExecutorService asynchronousExecutor)
          throws ClassNotFoundException
@@ -135,8 +140,7 @@
     * @see org.jboss.ejb3.endpoint.Endpoint#invoke(java.io.Serializable, java.lang.Class, java.lang.reflect.Method, java.lang.Object[])
     */
    public Object invoke(final Serializable session, final Class<?> invokedBusinessInterface, final Method method,
-         final Object[] args)
-         throws Throwable
+         final Object[] args) throws Throwable
    {
       /*
        * For now we'll just delegate to the legacy implementation 
@@ -144,16 +148,98 @@
        * will be the real handler
        */
       //TODO Move away from InvokableContext contract EJBTHREE-1782
-      
+
       // Create a SerializableMethod view
-      SerializableMethod sMethod = new SerializableMethod(method,invokedBusinessInterface);
-      
+      SerializableMethod sMethod = new SerializableMethod(method, invokedBusinessInterface);
+
       // Handle in the transition method
       return this.invoke(session, sMethod, args);
    }
-   
-   
+
    /**
+    * {@inheritDoc}
+    * @see org.jboss.ejb3.async.spi.AsyncEndpoint#invokeAsync(java.io.Serializable, java.lang.Class, java.lang.reflect.Method, java.lang.Object[])
+    */
+   @Override
+   public Object invokeAsync(final Serializable session, final Class<?> invokedBusinessInterface, final Method method,
+         final Object[] args) throws Throwable
+   {
+      // Get the ES
+      final ExecutorService es = this.getAsynchronousExecutor();
+      
+      // Get the Security Context
+      final SecurityContext sc = SecurityActions.getSecurityContext();
+
+      // Make a new ID for the invocation
+      final AsyncInvocationId id = new AsyncInvocationIdUUIDImpl();
+
+      // Submit as async
+      final Future<?> returnValue = es.submit(new AsyncInvocationTask<Object>(session,method,args, sc, id));
+
+      // Return
+      return returnValue;
+   }
+
+   /**
+    * Task used to dispatch a local invocation upon the server 
+    * asynchronously
+    * @author <a href="mailto:andrew.rubinger at jboss.org">ALR</a>
+    */
+   private class AsyncInvocationTask<V> extends AsyncInvocationTaskBase<V>
+   {
+
+      private final Serializable session;
+
+      private final Method method;
+
+      private final Object[] args;
+
+      AsyncInvocationTask(final Serializable session, final Method method, final Object[] args,
+            final SecurityContext sc, final AsyncInvocationId id)
+      {
+         super(sc, id);
+         this.session = session;
+         this.method = method;
+         this.args = args;
+      }
+
+      /**
+       * {@inheritDoc}
+       * @see org.jboss.ejb3.async.spi.AsyncInvocationTaskBase#before()
+       */
+      @Override
+      protected void before() throws Exception
+      {
+         // Mark the current invocation on the executing Thread
+         CurrentAsyncInvocation.markCurrentInvocationOnThread(this.id);
+      }
+
+      /**
+       * {@inheritDoc}
+       * @see org.jboss.ejb3.async.spi.AsyncInvocationTaskBase#proceed()
+       */
+      @Override
+      @SuppressWarnings("unchecked")
+      protected V proceed() throws Throwable
+      {
+         // Invoke on the container
+         return (V) SessionSpecContainer.this.invoke(session, null, method, args);
+      }
+
+      /**
+       * {@inheritDoc}
+       * @see org.jboss.ejb3.async.spi.AsyncInvocationTaskBase#after()
+       */
+      @Override
+      protected void after() throws Exception
+      {
+         // Unmark the current invocation from the executing Thread
+         CurrentAsyncInvocation.unmarkCurrentInvocationFromThread();
+      }
+
+   }
+
+   /**
     * A transition method in moving from InvokableContext.invoke to Endpoint.invoke.
     * 
     * Invokes the specified method upon the specified session, passing the specified
@@ -175,7 +261,7 @@
       ClassLoader oldLoader = SecurityActions.getContextClassLoader();
 
       SecurityActions.setContextClassLoader(this.getClassloader());
-      
+
       /*
        * Obtain the target method (advised)
        */
@@ -190,7 +276,7 @@
       }
       Method unadvisedMethod = info.getUnadvisedMethod();
       SerializableMethod unadvisedSerializableMethod = new SerializableMethod(unadvisedMethod);
-      
+
       // Mark the start time
       long start = System.currentTimeMillis();
 
@@ -202,7 +288,7 @@
          {
             invokedBusinessInterface = null;
          }
-         
+
          // Increment invocation statistics
          invokeStats.callIn();
 
@@ -256,7 +342,7 @@
 
          // Complete call to increment statistics
          invokeStats.callOut();
-         
+
          SecurityActions.setContextClassLoader(oldLoader);
       }
    }
@@ -299,7 +385,7 @@
     * @see org.jboss.ejb3.async.spi.AsyncCancellableContext#cancel(org.jboss.ejb3.async.spi.AsyncInvocationId)
     */
    @Override
-   public void cancel(final AsyncInvocationId id) throws IllegalArgumentException
+   public boolean cancel(final AsyncInvocationId id) throws IllegalArgumentException
    {
       // Precondition checks
       if (id == null)
@@ -309,7 +395,7 @@
 
       // Put a flag in the cancel map, will be cleared when the invocation passes through
       final AsyncInvocationMap map = this.getCurrentAsyncInvocations();
-      map.put(id, true);
+      return map.put(id, true) != null;
    }
 
    /**
@@ -376,13 +462,13 @@
       }
 
       // Allow override of the remote proxy
-      if(!isLocal)
+      if (!isLocal)
       {
          RemoteProxyFactory remoteProxyFactory = CurrentRemoteProxyFactory.get();
-         if(remoteProxyFactory != null)
+         if (remoteProxyFactory != null)
             return remoteProxyFactory.create(null);
       }
-      
+
       // Lookup
       String proxyFactoryKey = this.getJndiRegistrar().getProxyFactoryRegistryKey(jndiName, smd, isLocal);
       Object factory = Ejb3RegistrarLocator.locateRegistrar().lookup(proxyFactoryKey);
@@ -554,14 +640,14 @@
       // Use legacy
       return this.isHandleMethod(invokingMethod);
    }
-   
+
    /**
     * Returns the busines interfaces for this EJB
     * @return
     */
    protected Set<Class<?>> getBusinessInterfaces()
    {
-      if(businessInterfaces==null)
+      if (businessInterfaces == null)
       {
          throw new IllegalStateException("Business interfaces not yet initialized");
       }
@@ -607,9 +693,9 @@
    protected void lockedStart() throws Exception
    {
       log.info("Starting " + this);
-      
+
       // Cache the business interfaces
-      final Set<Class<?>> set = new HashSet<Class<?>>(); 
+      final Set<Class<?>> set = new HashSet<Class<?>>();
       final Set<String> businessInterfaceNames = new HashSet<String>();
       if (this.getMetaData().getBusinessLocals() != null)
       {
@@ -635,7 +721,7 @@
       businessInterfaces = Collections.unmodifiableSet(set);
 
       verifyBusinessObjectFactory();
-      
+
       super.lockedStart();
    }
 
@@ -649,7 +735,7 @@
 
       super.lockedStop();
    }
-	
+
    /**
     * Returns the {@link ExecutorService} used in processing Asynchronous invocations
     */
@@ -667,7 +753,7 @@
    {
       log.warn("EJBTHREE-2126: container " + this + " does not verify the businessObjectFactory");
    }
-   
+
    public AsyncInvocationMap getCurrentAsyncInvocations()
    {
       return this.currentAsyncInvocations;

Modified: projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/stateful/StatefulContainerInvocation.java
===================================================================
--- projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/stateful/StatefulContainerInvocation.java	2010-12-10 11:07:54 UTC (rev 109818)
+++ projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/stateful/StatefulContainerInvocation.java	2010-12-10 11:23:34 UTC (rev 109819)
@@ -21,12 +21,15 @@
  */
 package org.jboss.ejb3.stateful;
 
+import java.lang.reflect.Method;
+import java.util.concurrent.ExecutorService;
+
 import org.jboss.aop.Advisor;
 import org.jboss.aop.MethodInfo;
 import org.jboss.aop.advice.Interceptor;
 import org.jboss.aop.joinpoint.Invocation;
 import org.jboss.ejb3.EJBContainerInvocation;
-import org.jboss.ejb3.async.spi.AsyncCancellableContext;
+import org.jboss.ejb3.async.spi.AsyncEndpoint;
 import org.jboss.ejb3.async.spi.AsyncInvocation;
 import org.jboss.ejb3.async.spi.AsyncInvocationContext;
 import org.jboss.ejb3.core.context.EJBInvocation;
@@ -34,9 +37,6 @@
 import org.jboss.ejb3.interceptors.container.BeanContext;
 import org.jboss.ejb3.tx2.spi.TransactionalInvocationContext;
 
-import java.lang.reflect.Method;
-import java.util.concurrent.ExecutorService;
-
 /**
  * Comment
  *
@@ -50,26 +50,26 @@
    
    private Object id;
    private SessionInvocationContextAdapter invocationContext;
-   private AsyncCancellableContext asyncCancellableContext;
+   private AsyncEndpoint container;
 
    public StatefulContainerInvocation(Interceptor[] interceptors, long methodHash, Method advisedMethod,
          Method unadvisedMethod, Advisor advisor, Object id, Class<?> invokedBusinessInterface,
-         final ExecutorService asyncExecutor, final AsyncCancellableContext asyncCancellableContext)
+         final ExecutorService asyncExecutor, final AsyncEndpoint container)
    {
       super(interceptors, methodHash, advisedMethod, unadvisedMethod, advisor);
       this.id = id;
-      this.invocationContext = new SessionInvocationContextAdapter(invokedBusinessInterface, this, asyncExecutor,asyncCancellableContext);
-      this.asyncCancellableContext = asyncCancellableContext;
+      this.invocationContext = new SessionInvocationContextAdapter(invokedBusinessInterface, this, asyncExecutor,container);
+      this.container = container;
    }
 
    public StatefulContainerInvocation(MethodInfo info, Object id, Class<?> invokedBusinessInterface,
-         final ExecutorService asyncExecutor, final AsyncCancellableContext asyncCancellableContext)
+         final ExecutorService asyncExecutor, final AsyncEndpoint container)
    {
       super(info);
       this.id = id;
       this.invocationContext = new SessionInvocationContextAdapter(invokedBusinessInterface, this, asyncExecutor,
-            asyncCancellableContext);
-      this.asyncCancellableContext = asyncCancellableContext;
+            container);
+      this.container = container;
    }
 
    public StatefulContainerInvocation()
@@ -85,7 +85,7 @@
    {
       StatefulContainerInvocation wrapper = new StatefulContainerInvocation(interceptors, methodHash, advisedMethod,
             unadvisedMethod, advisor, id, invocationContext.getInvokedBusinessInterface(),
-            invocationContext.getAsynchronousExecutor(), this.asyncCancellableContext);
+            invocationContext.getAsynchronousExecutor(), this.container);
       wrapper.metadata = this.metadata;
       wrapper.currentInterceptor = this.currentInterceptor;
       //wrapper.setTargetObject(this.getTargetObject());
@@ -120,8 +120,8 @@
    }
 
    @Override
-   public AsyncCancellableContext getCancellableContext()
+   public AsyncEndpoint getContainer()
    {
-      return asyncCancellableContext;
+      return container;
    }
 }

Modified: projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/stateless/StatelessInstanceInterceptor.java
===================================================================
--- projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/stateless/StatelessInstanceInterceptor.java	2010-12-10 11:07:54 UTC (rev 109818)
+++ projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/stateless/StatelessInstanceInterceptor.java	2010-12-10 11:23:34 UTC (rev 109819)
@@ -73,6 +73,11 @@
                  ((ex instanceof RuntimeException || ex instanceof RemoteException) && !StatefulRemoveInterceptor.isApplicationException(ex, (MethodInvocation)invocation));
          throw ex;
       }
+      catch (final Throwable t)
+      {
+         discard = true;
+         throw t;
+      }
       finally
       {
          container.popContext();



More information about the jboss-cvs-commits mailing list