[
https://issues.apache.org/jira/browse/OPENEJB-1099?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12871983#action_12871983
]
Thiago Veronezi commented on OPENEJB-1099:
------------------------------------------
Well... I think thats it.
Im changing the code shown above by this one below...
// ****************************************
final Class<?> beanCls = instance.bean.getClass();
final AccessTimeout accessTimeout =
beanCls.getAnnotation(AccessTimeout.class);
Lock currLock = instance.getLock();
final boolean lockAcquired;
if(accessTimeout == null) {
// returns immediately true if the lock is available
lockAcquired = currLock.tryLock();
} else {
// AccessTimeout annotation found.
// Trying to get the lock within the specified period.
try {
lockAcquired =
currLock.tryLock(accessTimeout.value(), accessTimeout.unit());
} catch (InterruptedException e) {
throw new ApplicationException("Unable
to get lock.", e);
}
}
// Did we acquire the lock to the current execution?
if (!lockAcquired) {
throw new ApplicationException(
new ConcurrentAccessTimeoutException("Unable
to get lock."));
}
// ****************************************
Its not tested. Im trying to figure out how to create a unit test for it. Could
you validate the solution above and say if it is what you were thinking?
Another thing: Does make any sense to annotate stateful beans methods with
AccessTimeout? I think thats only for Singleton, but Im not sure.
Thank you.
> Reentrant calls to Stateful beans
> ---------------------------------
>
> Key: OPENEJB-1099
> URL: https://issues.apache.org/jira/browse/OPENEJB-1099
> Project: OpenEJB
> Issue Type: Bug
> Components: container system
> Affects Versions: 3.1, 3.1.1, 3.1.2
> Reporter: David Blevins
> Fix For: 3.1.3
>
>
> A stateful bean should be able to invoke itself via its business interface.
> The following code should work:
> @Stateful
> public class MySessionBean implements MySessionBeanLocal {
> @Resource
> private SessionConext context;
> public void method1() {
> System.out.println("Method 1 invoked!");
> context.getBusinessObject(mySessionBeanLocal.class).method2();
> }
> public void method2() {
> System.out.println("Method 2 invoked!");
> }
> }
> Currently this results in the following exception:
> I get a "Concurrent calls not allowed" exception:
> javax.ejb.EJBException: The bean encountered a non-application exception;
> nested exception is:
> javax.ejb.EJBException: Concurrent calls not allowed
> at
> org.apache.openejb.core.ivm.BaseEjbProxyHandler.convertException(BaseEjbProxyHandler.java:358)
> at
> org.apache.openejb.core.ivm.BaseEjbProxyHandler.invoke(BaseEjbProxyHandler.java:286)
> at $Proxy117.method1(Unknown Source)
> //....
> Caused by: javax.ejb.EJBException: Concurrent calls not allowed
> at
> org.apache.openejb.core.ivm.BaseEjbProxyHandler.convertException(BaseEjbProxyHandler.java:358)
> at
> org.apache.openejb.core.ivm.BaseEjbProxyHandler.invoke(BaseEjbProxyHandler.java:286)
> at $Proxy117.Method2(Unknown Source)
> //...
> Caused by: java.rmi.RemoteException: Concurrent calls not allowed
> at
> org.apache.openejb.core.stateful.StatefulContainer.obtainInstance(StatefulContainer.java:635)
> at
> org.apache.openejb.core.stateful.StatefulContainer.businessMethod(StatefulContainer.java:484)
> at
> org.apache.openejb.core.stateful.StatefulContainer.invoke(StatefulContainer.java:274)
> at
> org.apache.openejb.core.ivm.EjbObjectProxyHandler.businessMethod(EjbObjectProxyHandler.java:217)
> at
> org.apache.openejb.core.ivm.EjbObjectProxyHandler._invoke(EjbObjectProxyHandler.java:77)
> at
> org.apache.openejb.core.ivm.BaseEjbProxyHandler.invoke(BaseEjbProxyHandler.java:281)
> ... 56 more
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.