You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by ga...@apache.org on 2010/08/26 06:28:14 UTC

svn commit: r989439 - in /openejb/trunk/openejb3/container/openejb-core/src/main: java/org/apache/openejb/core/ java/org/apache/openejb/core/singleton/ java/org/apache/openejb/core/stateful/ resources/META-INF/org.apache.openejb/

Author: gawor
Date: Thu Aug 26 04:28:14 2010
New Revision: 989439

URL: http://svn.apache.org/viewvc?rev=989439&view=rev
Log:
Support per-method @AccessTimeout for singleton container

Modified:
    openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/CoreDeploymentInfo.java
    openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/singleton/SingletonContainer.java
    openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/StatefulContainer.java
    openejb/trunk/openejb3/container/openejb-core/src/main/resources/META-INF/org.apache.openejb/service-jar.xml

Modified: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/CoreDeploymentInfo.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/CoreDeploymentInfo.java?rev=989439&r1=989438&r2=989439&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/CoreDeploymentInfo.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/CoreDeploymentInfo.java Thu Aug 26 04:28:14 2010
@@ -1034,6 +1034,10 @@ public class CoreDeploymentInfo extends 
         return null;
     }
 
+    public Duration getAccessTimeout(Method beanMethod) {
+        return getMethodContext(beanMethod).getAccessTimeout();
+    }
+    
 	public Duration getAccessTimeout() {
 		return accessTimeout;
 	}

Modified: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/singleton/SingletonContainer.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/singleton/SingletonContainer.java?rev=989439&r1=989438&r2=989439&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/singleton/SingletonContainer.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/singleton/SingletonContainer.java Thu Aug 26 04:28:14 2010
@@ -76,8 +76,7 @@ public class SingletonContainer implemen
 
     private Object containerID = null;
     private SecurityService securityService;
-    private long wait = 30;
-    private TimeUnit unit = TimeUnit.SECONDS;
+    private Duration accessTimeout;
     private BlockingQueue<Runnable> asynchQueue = new LinkedBlockingQueue<Runnable>();
     private ThreadPoolExecutor asynchPool = new ThreadPoolExecutor(1, 20, 60, TimeUnit.SECONDS, asynchQueue);
     private CompletionService<Object> asynchService = new ExecutorCompletionService<Object>(asynchPool);
@@ -95,10 +94,7 @@ public class SingletonContainer implemen
     }
 
     public void setAccessTimeout(Duration duration){
-        if (duration.getUnit() != null) {
-            this.unit = duration.getUnit();
-        }
-        this.wait = duration.getTime();
+        this.accessTimeout = duration;
     }
 
     public synchronized DeploymentInfo [] deployments() {
@@ -243,10 +239,11 @@ public class SingletonContainer implemen
 
     protected Object _invoke(Method callMethod, Method runMethod, Object[] args, Instance instance, ThreadContext callContext, InterfaceType callType) throws OpenEJBException {
         CoreDeploymentInfo deploymentInfo = callContext.getDeploymentInfo();
-
+               
+        Duration accessTimeout = getAccessTimeout(deploymentInfo, runMethod);        
         boolean read = deploymentInfo.getConcurrencyAttribute(runMethod) == javax.ejb.LockType.READ;
-
-        final Lock lock = aquireLock(read, instance);
+        
+        final Lock lock = aquireLock(read, accessTimeout, instance);
 
         Object returnValue;
         try {
@@ -288,21 +285,47 @@ public class SingletonContainer implemen
         return returnValue;
     }
 
-    private Lock aquireLock(boolean read, Instance instance) {
+    private Duration getAccessTimeout(CoreDeploymentInfo deploymentInfo, Method callMethod) {
+        Duration accessTimeout = deploymentInfo.getAccessTimeout(callMethod);
+        if (accessTimeout == null) {
+            accessTimeout = deploymentInfo.getAccessTimeout();
+            if (accessTimeout == null) {
+                accessTimeout = this.accessTimeout;
+            }
+        }
+        return accessTimeout;
+    }
+    
+    private Lock aquireLock(boolean read, Duration accessTimeout, Instance instance) {
         final Lock lock;
         if (read) {
             lock = instance.lock.readLock();
         } else {
             lock = instance.lock.writeLock();
         }
-
-        try {
-            if (!lock.tryLock(wait, unit)){
-                throw new ConcurrentAccessTimeoutException();
+        
+        boolean lockAcquired;
+        if (accessTimeout == null || accessTimeout.getTime() < 0) {
+            // wait indefinitely for a lock
+            lock.lock();
+            lockAcquired = true;
+        } else if (accessTimeout.getTime() == 0) {
+            // concurrent calls are not allowed, lock only once
+            lockAcquired = lock.tryLock();
+        } else {
+            // try to get a lock within the specified period. 
+            try {
+                lockAcquired = lock.tryLock(accessTimeout.getTime(), accessTimeout.getUnit());
+            } catch (InterruptedException e) {
+                throw (ConcurrentAccessTimeoutException) new ConcurrentAccessTimeoutException().initCause(e);
             }
-        } catch (InterruptedException e) {
-            throw (ConcurrentAccessTimeoutException) new ConcurrentAccessTimeoutException().initCause(e);
         }
+
+        // Did we acquire the lock to the current execution?
+        if (!lockAcquired) {
+            throw new ConcurrentAccessTimeoutException("Unable to get lock.");
+        }
+
         return lock;
     }
 

Modified: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/StatefulContainer.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/StatefulContainer.java?rev=989439&r1=989438&r2=989439&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/StatefulContainer.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/StatefulContainer.java Thu Aug 26 04:28:14 2010
@@ -62,7 +62,6 @@ import org.apache.openejb.core.Exception
 import static org.apache.openejb.core.ExceptionType.APPLICATION_ROLLBACK;
 import static org.apache.openejb.core.ExceptionType.SYSTEM;
 
-import org.apache.openejb.core.MethodContext;
 import org.apache.openejb.core.Operation;
 import org.apache.openejb.core.ThreadContext;
 import org.apache.openejb.core.InstanceContext;
@@ -681,16 +680,16 @@ public class StatefulContainer implement
     }
 
     private Duration getAccessTimeout(CoreDeploymentInfo deploymentInfo, Method callMethod) {
-        Duration accessTimeout = null;
         callMethod = deploymentInfo.getMatchingBeanMethod(callMethod);
-        MethodContext methodContext = deploymentInfo.getMethodContext(callMethod);
-        if (methodContext != null) {
-            accessTimeout = methodContext.getAccessTimeout();
-        }
+        
+        Duration accessTimeout = deploymentInfo.getAccessTimeout(callMethod);
         if (accessTimeout == null) {
             accessTimeout = deploymentInfo.getAccessTimeout();
+            if (accessTimeout == null) {
+                accessTimeout = this.accessTimeout;
+            }
         }
-        return (accessTimeout == null) ? this.accessTimeout : accessTimeout;
+        return accessTimeout;
     }
     
     private Transaction getTransaction(ThreadContext callContext) {

Modified: openejb/trunk/openejb3/container/openejb-core/src/main/resources/META-INF/org.apache.openejb/service-jar.xml
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/resources/META-INF/org.apache.openejb/service-jar.xml?rev=989439&r1=989438&r2=989439&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/resources/META-INF/org.apache.openejb/service-jar.xml (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/resources/META-INF/org.apache.openejb/service-jar.xml Thu Aug 26 04:28:14 2010
@@ -326,7 +326,7 @@
           constructor="id, securityService"
           class-name="org.apache.openejb.core.singleton.SingletonContainer">
 
-    AccessTimeout = 30 seconds
+    AccessTimeout = -1 seconds
     
   </ServiceProvider>
 
@@ -353,7 +353,7 @@
     # seconds, minutes, hours, days.  Or any combination such as
     # "1 hour and 27 minutes and 10 seconds"
 
-    AccessTimeout = -1 milliseconds
+    AccessTimeout = -1 seconds
 
     # The cache is responsible for managing stateful bean
     # instances.  The cache can page instances to disk as memory