[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