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