[ 
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.

Reply via email to