JBoss Community

Re: JBoss 6.1.0.Final SFSB concurrency issue

created by Octavian Pop in EJB3 - View the full discussion

No one experienced this?

 

Below I posted the ContainerManagedConcurrencyInterceptor implementation which is invoked when a method from statefull beans is invoked.

 

public Object invoke(Invocation invocation) throws Throwable
    {
        Lock lock = getLock(invocation);
        long time = DEFAULT_MAX_TIMEOUT_VALUE;
        TimeUnit unit = DEFAULT_MAX_TIMEOUT_UNIT;
        AccessTimeoutEffigy timeout = getAccessTimeout((MethodInvocation) invocation);
 
 
        if (timeout != null)
        {
            if (timeout.getTimeout() < 0)
            {
                // for any negative value of timeout, we just default to max timeout val and max timeout unit.
                // violation of spec! But we don't want to wait indefinitely.
                logger.debug("Ignoring a negative @AccessTimeout value: " + timeout.getTimeout() + " and timeout unit: "
                        + timeout.getUnit().name() + ". Will default to timeout value: " + DEFAULT_MAX_TIMEOUT_VALUE
                        + " and timeout unit: " + DEFAULT_MAX_TIMEOUT_UNIT.name());
            }
            else
            {
                time = timeout.getTimeout();
                unit = timeout.getUnit();
            }
        }
        boolean success = lock.tryLock(time, unit);
        if (!success)
        {
            throw new ConcurrentAccessTimeoutException("EJB 3.1 PFD2 4.8.5.5.1 concurrent access timeout on " + invocation
                    + " - could not obtain lock within " + time + unit.name());
        }
        try
        {
            return invocation.invokeNext();
        }
        finally
        {
            lock.unlock();
        }
    }

 

The invocations on incrementNumber from GenericSFB are serialized at boolean success = lock.tryLock(time, unit);

It does not make sens to have mutual exclusion for statefull beans invocatins, as it looks to be implemented.


Reply to this message by going to Community

Start a new discussion in EJB3 at Community