You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by db...@apache.org on 2009/01/03 04:55:07 UTC
svn commit: r730902 - in
/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb:
./ config/ core/ core/stateful/
Author: dblevins
Date: Fri Jan 2 19:55:06 2009
New Revision: 730902
URL: http://svn.apache.org/viewvc?rev=730902&view=rev
Log:
OPENEJB-982: SessionSynchronization regression
Modified:
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/DeploymentInfo.java
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/VmDeploymentFactory.java
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/VmDeploymentManager.java
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/stateful/Instance.java
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/StatefulContainer.java
Modified: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/DeploymentInfo.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/DeploymentInfo.java?rev=730902&r1=730901&r2=730902&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/DeploymentInfo.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/DeploymentInfo.java Fri Jan 2 19:55:06 2009
@@ -146,4 +146,6 @@
public boolean isLoadOnStartup();
public Set<String> getDependsOn();
+
+ public boolean isSessionSynchronized();
}
Modified: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/VmDeploymentFactory.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/VmDeploymentFactory.java?rev=730902&r1=730901&r2=730902&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/VmDeploymentFactory.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/VmDeploymentFactory.java Fri Jan 2 19:55:06 2009
@@ -33,7 +33,7 @@
}
public String getProductVersion() {
- return "3.0";
+ return "3.1.1";
}
public boolean handlesURI(String uri) {
Modified: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/VmDeploymentManager.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/VmDeploymentManager.java?rev=730902&r1=730901&r2=730902&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/VmDeploymentManager.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/VmDeploymentManager.java Fri Jan 2 19:55:06 2009
@@ -91,7 +91,7 @@
String openejbUri = System.getProperty("openejb.server.uri");
if (openejbUri == null) {
try {
- openejbUri = new URI("ejb", null, "localhost", 4201, null, null, null).toString();
+ openejbUri = new URI("ejbd", null, "localhost", 4201, null, null, null).toString();
} catch (URISyntaxException e) {
throw new RuntimeException(e);
}
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=730902&r1=730901&r2=730902&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 Fri Jan 2 19:55:06 2009
@@ -35,6 +35,7 @@
import javax.ejb.TimedObject;
import javax.ejb.Timer;
import javax.ejb.ScheduleExpression;
+import javax.ejb.SessionSynchronization;
import javax.naming.Context;
import javax.persistence.EntityManagerFactory;
@@ -1069,4 +1070,8 @@
public Set<String> getDependsOn() {
return dependsOn;
}
+
+ public boolean isSessionSynchronized() {
+ return !isBeanManagedTransaction() && SessionSynchronization.class.isAssignableFrom(beanClass);
+ }
}
Modified: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/Instance.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/Instance.java?rev=730902&r1=730901&r2=730902&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/Instance.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/Instance.java Fri Jan 2 19:55:06 2009
@@ -40,7 +40,6 @@
private boolean inUse;
private SuspendedTransaction beanTransaction;
- private boolean callSessionSynchronization;
// todo if we keyed by an entity manager factory id we would not have to make this transient and rebuild the index below
// This would require that we crete an id and that we track it
@@ -84,14 +83,6 @@
this.beanTransaction = beanTransaction;
}
- public synchronized boolean isCallSessionSynchronization() {
- return callSessionSynchronization;
- }
-
- public synchronized void setCallSessionSynchronization() {
- this.callSessionSynchronization = true;
- }
-
public synchronized Map<EntityManagerFactory, EntityManager> getEntityManagers(Index<EntityManagerFactory, Map> factories) {
if (entityManagers == null && entityManagerArray != null) {
entityManagers = new HashMap<EntityManagerFactory, EntityManager>();
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=730902&r1=730901&r2=730902&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 Fri Jan 2 19:55:06 2009
@@ -291,6 +291,9 @@
}
}
+ createContext.setCurrentOperation(Operation.CREATE);
+ createContext.setCurrentAllowedStates(StatefulContext.getStates());
+
// Start transaction
TransactionPolicy txPolicy = createTransactionPolicy(createContext.getDeploymentInfo().getTransactionType(callMethod), createContext);
@@ -307,8 +310,6 @@
!callMethod.getDeclaringClass().equals(DeploymentInfo.BusinessRemoteHome.class)){
// Setup for business invocation
- createContext.setCurrentOperation(Operation.CREATE);
- createContext.setCurrentAllowedStates(StatefulContext.getStates());
Method createOrInit = deploymentInfo.getMatchingBeanMethod(callMethod);
createContext.set(Method.class, createOrInit);
@@ -764,12 +765,11 @@
}
// SessionSynchronization are only enabled for beans after CREATE that are not bean-managed and implement the SessionSynchronization interface
- boolean sessionSynchronization = callContext.getCurrentOperation() != Operation.CREATE &&
- callContext.getDeploymentInfo().isBeanManagedTransaction() &&
- instance.bean instanceof SessionSynchronization &&
+ boolean synchronize = callContext.getCurrentOperation() != Operation.CREATE &&
+ callContext.getDeploymentInfo().isSessionSynchronized() &&
txPolicy.isTransactionActive();
- coordinator.registerSessionSynchronization(instance, callContext.getDeploymentInfo(), callContext.getPrimaryKey(), sessionSynchronization);
+ coordinator.registerSessionSynchronization(instance, callContext.getDeploymentInfo(), callContext.getPrimaryKey(), synchronize);
}
/**
@@ -778,24 +778,49 @@
* This class also is responsible for calling releaseInstance after the transaction completes.
*/
private class SessionSynchronizationCoordinator implements TransactionSynchronization {
- private final Map<Object, Instance> registry = new HashMap<Object, Instance>();
+ private final Map<Object, Synchronization> registry = new HashMap<Object, Synchronization>();
private final TransactionPolicy txPolicy;
private SessionSynchronizationCoordinator(TransactionPolicy txPolicy) {
this.txPolicy = txPolicy;
}
- private void registerSessionSynchronization(Instance instance, CoreDeploymentInfo deploymentInfo, Object primaryKey, boolean sessionSynchronization) {
- // register
- if (!registry.containsKey(primaryKey)) {
- registry.put(primaryKey, instance);
+ public class Synchronization {
+ private final Instance instance;
+
+ private boolean callSessionSynchronization;
+
+ public Synchronization(Instance instance) {
+ this.instance = instance;
+ }
+
+ public synchronized boolean isCallSessionSynchronization() {
+ return callSessionSynchronization;
}
+ public synchronized boolean setCallSessionSynchronization(boolean synchronize) {
+ boolean oldValue = this.callSessionSynchronization;
+ this.callSessionSynchronization = synchronize;
+ return oldValue;
+ }
+
+ }
+
+ private void registerSessionSynchronization(Instance instance, CoreDeploymentInfo deploymentInfo, Object primaryKey, boolean synchronize) {
+
+ Synchronization synchronization = registry.get(primaryKey);
+
+ if (synchronization == null){
+ synchronization = new Synchronization(instance);
+ registry.put(primaryKey, synchronization);
+ }
+
+ boolean wasSynchronized = synchronization.setCallSessionSynchronization(synchronize);
+
// check if afterBegin has already been invoked or if this is not a session synchronization bean
- if (instance.isCallSessionSynchronization() || !sessionSynchronization) {
+ if (wasSynchronized || !synchronize) {
return;
}
- instance.setCallSessionSynchronization();
// Invoke afterBegin
ThreadContext callContext = new ThreadContext(instance.deploymentInfo, instance.primaryKey, Operation.AFTER_BEGIN);
@@ -824,12 +849,15 @@
}
public void beforeCompletion() {
- for (Instance instance : registry.values()) {
+ for (Synchronization synchronization : registry.values()) {
+
+ Instance instance = synchronization.instance;
+
// don't call beforeCompletion when transaction is marked rollback only
if (txPolicy.isRollbackOnly()) return;
// only call beforeCompletion on beans with session synchronization
- if (!instance.isCallSessionSynchronization()) continue;
+ if (!synchronization.isCallSessionSynchronization()) continue;
// Invoke beforeCompletion
ThreadContext callContext = new ThreadContext(instance.deploymentInfo, instance.primaryKey, Operation.BEFORE_COMPLETION);
@@ -869,14 +897,16 @@
public void afterCompletion(Status status) {
Throwable firstException = null;
- for (Instance instance : registry.values()) {
+ for (Synchronization synchronization : registry.values()) {
+
+ Instance instance = synchronization.instance;
ThreadContext callContext = new ThreadContext(instance.deploymentInfo, instance.primaryKey, Operation.AFTER_COMPLETION);
callContext.setCurrentAllowedStates(StatefulContext.getStates());
ThreadContext oldCallContext = ThreadContext.enter(callContext);
try {
instance.setInUse(true);
- if (instance.isCallSessionSynchronization()) {
+ if (synchronization.isCallSessionSynchronization()) {
Method afterCompletion = SessionSynchronization.class.getMethod("afterCompletion", boolean.class);
List<InterceptorData> interceptors = instance.deploymentInfo.getMethodInterceptors(afterCompletion);