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