You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by jl...@apache.org on 2011/06/29 14:30:59 UTC
svn commit: r1141069 - in /openejb/branches/openejb-3.2.x: ./
container/openejb-core/src/main/java/org/apache/openejb/core/managed/
container/openejb-core/src/main/java/org/apache/openejb/core/stateful/
container/openejb-core/src/main/java/org/apache/o...
Author: jlmonteiro
Date: Wed Jun 29 12:30:58 2011
New Revision: 1141069
URL: http://svn.apache.org/viewvc?rev=1141069&view=rev
Log:
Merge 1097964
OPENEJB-1091: Cause of RollbackException swallowed
Upgrade to version of Geronimo Transaction manager that supports the rollback cause. Use the setRollbackOnly(Throwable) method if it is available in the Transaction implementation.
Added:
openejb/branches/openejb-3.2.x/container/openejb-core/src/test/java/org/apache/openejb/transaction/
- copied from r1097964, openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/transaction/
openejb/branches/openejb-3.2.x/container/openejb-core/src/test/java/org/apache/openejb/transaction/TransactionRollbackCauseTest.java
- copied unchanged from r1097964, openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/transaction/TransactionRollbackCauseTest.java
Modified:
openejb/branches/openejb-3.2.x/container/openejb-core/src/main/java/org/apache/openejb/core/managed/ManagedContainer.java
openejb/branches/openejb-3.2.x/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/StatefulContainer.java
openejb/branches/openejb-3.2.x/container/openejb-core/src/main/java/org/apache/openejb/core/transaction/EjbTransactionUtil.java
openejb/branches/openejb-3.2.x/container/openejb-core/src/main/java/org/apache/openejb/core/transaction/JtaTransactionPolicy.java
openejb/branches/openejb-3.2.x/container/openejb-core/src/main/java/org/apache/openejb/core/transaction/TransactionPolicy.java
openejb/branches/openejb-3.2.x/container/openejb-spring/src/main/java/org/apache/openejb/spring/SpringTransactionPolicy.java
openejb/branches/openejb-3.2.x/pom.xml
Modified: openejb/branches/openejb-3.2.x/container/openejb-core/src/main/java/org/apache/openejb/core/managed/ManagedContainer.java
URL: http://svn.apache.org/viewvc/openejb/branches/openejb-3.2.x/container/openejb-core/src/main/java/org/apache/openejb/core/managed/ManagedContainer.java?rev=1141069&r1=1141068&r2=1141069&view=diff
==============================================================================
--- openejb/branches/openejb-3.2.x/container/openejb-core/src/main/java/org/apache/openejb/core/managed/ManagedContainer.java (original)
+++ openejb/branches/openejb-3.2.x/container/openejb-core/src/main/java/org/apache/openejb/core/managed/ManagedContainer.java Wed Jun 29 12:30:58 2011
@@ -978,7 +978,7 @@ public class ManagedContainer implements
logger.error(message, e);
// [2] Mark the transaction for rollback.
- txPolicy.setRollbackOnly();
+ txPolicy.setRollbackOnly(e);
// [3] Discard the instance
discardInstance(callContext);
Modified: openejb/branches/openejb-3.2.x/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/StatefulContainer.java
URL: http://svn.apache.org/viewvc/openejb/branches/openejb-3.2.x/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/StatefulContainer.java?rev=1141069&r1=1141068&r2=1141069&view=diff
==============================================================================
--- openejb/branches/openejb-3.2.x/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/StatefulContainer.java (original)
+++ openejb/branches/openejb-3.2.x/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/StatefulContainer.java Wed Jun 29 12:30:58 2011
@@ -989,7 +989,7 @@ public class StatefulContainer implement
logger.error(message, e);
// [2] Mark the transaction for rollback.
- txPolicy.setRollbackOnly();
+ txPolicy.setRollbackOnly(e);
// [3] Discard the instance
discardInstance(callContext);
Modified: openejb/branches/openejb-3.2.x/container/openejb-core/src/main/java/org/apache/openejb/core/transaction/EjbTransactionUtil.java
URL: http://svn.apache.org/viewvc/openejb/branches/openejb-3.2.x/container/openejb-core/src/main/java/org/apache/openejb/core/transaction/EjbTransactionUtil.java?rev=1141069&r1=1141068&r2=1141069&view=diff
==============================================================================
--- openejb/branches/openejb-3.2.x/container/openejb-core/src/main/java/org/apache/openejb/core/transaction/EjbTransactionUtil.java (original)
+++ openejb/branches/openejb-3.2.x/container/openejb-core/src/main/java/org/apache/openejb/core/transaction/EjbTransactionUtil.java Wed Jun 29 12:30:58 2011
@@ -115,7 +115,7 @@ public final class EjbTransactionUtil {
*/
public static void handleApplicationException(TransactionPolicy txPolicy, Throwable appException, boolean rollback) throws ApplicationException {
if (rollback) {
- txPolicy.setRollbackOnly();
+ txPolicy.setRollbackOnly(appException);
}
if (!(appException instanceof ApplicationException)) {
@@ -139,7 +139,7 @@ public final class EjbTransactionUtil {
}
// Mark the transaction for rollback
- txPolicy.setRollbackOnly();
+ txPolicy.setRollbackOnly(sysException);
// Throw InvalidateReferenceException
if (txPolicy.isClientTransaction()) {
Modified: openejb/branches/openejb-3.2.x/container/openejb-core/src/main/java/org/apache/openejb/core/transaction/JtaTransactionPolicy.java
URL: http://svn.apache.org/viewvc/openejb/branches/openejb-3.2.x/container/openejb-core/src/main/java/org/apache/openejb/core/transaction/JtaTransactionPolicy.java?rev=1141069&r1=1141068&r2=1141069&view=diff
==============================================================================
--- openejb/branches/openejb-3.2.x/container/openejb-core/src/main/java/org/apache/openejb/core/transaction/JtaTransactionPolicy.java (original)
+++ openejb/branches/openejb-3.2.x/container/openejb-core/src/main/java/org/apache/openejb/core/transaction/JtaTransactionPolicy.java Wed Jun 29 12:30:58 2011
@@ -16,28 +16,29 @@
*/
package org.apache.openejb.core.transaction;
-import java.rmi.RemoteException;
-import java.util.Map;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.LinkedList;
-import java.util.ArrayList;
+import org.apache.openejb.ApplicationException;
+import org.apache.openejb.SystemException;
+import org.apache.openejb.loader.SystemInstance;
+import org.apache.openejb.util.LogCategory;
+import org.apache.openejb.util.Logger;
+
import javax.transaction.HeuristicMixedException;
import javax.transaction.HeuristicRollbackException;
import javax.transaction.InvalidTransactionException;
import javax.transaction.RollbackException;
import javax.transaction.Status;
+import javax.transaction.Synchronization;
import javax.transaction.Transaction;
import javax.transaction.TransactionManager;
import javax.transaction.TransactionSynchronizationRegistry;
-import javax.transaction.Synchronization;
import javax.transaction.xa.XAResource;
-
-import org.apache.openejb.ApplicationException;
-import org.apache.openejb.SystemException;
-import org.apache.openejb.loader.SystemInstance;
-import org.apache.openejb.util.LogCategory;
-import org.apache.openejb.util.Logger;
+import java.lang.reflect.Method;
+import java.rmi.RemoteException;
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
public abstract class JtaTransactionPolicy implements TransactionPolicy {
protected final static Logger logger = Logger.getInstance(LogCategory.OPENEJB, "org.apache.openejb.util.resources");
@@ -47,7 +48,7 @@ public abstract class JtaTransactionPoli
protected final TransactionManager transactionManager;
private final TransactionSynchronizationRegistry synchronizationRegistry;
- private Map<Object,Object> resources;
+ private Map<Object, Object> resources;
private final List<TransactionSynchronization> synchronizations = new LinkedList<TransactionSynchronization>();
private boolean rollbackOnly;
@@ -79,7 +80,7 @@ public abstract class JtaTransactionPoli
public boolean isRollbackOnly() {
Transaction trasaction = getCurrentTransaction();
- if (trasaction != null) {
+ if (trasaction != null) {
try {
int status = trasaction.getStatus();
return status == Status.STATUS_MARKED_ROLLBACK;
@@ -92,9 +93,14 @@ public abstract class JtaTransactionPoli
}
public void setRollbackOnly() {
+ setRollbackOnly(null);
+ }
+
+ @Override
+ public void setRollbackOnly(Throwable reason) {
Transaction trasaction = getCurrentTransaction();
- if (trasaction != null) {
- setRollbackOnly(trasaction);
+ if (trasaction != null) {
+ setRollbackOnly(trasaction, reason);
} else {
rollbackOnly = true;
}
@@ -117,7 +123,7 @@ public abstract class JtaTransactionPoli
}
if (resources == null) {
- resources = new LinkedHashMap<Object,Object>();
+ resources = new LinkedHashMap<Object, Object>();
}
resources.put(key, value);
}
@@ -206,18 +212,45 @@ public abstract class JtaTransactionPoli
}
- protected void setRollbackOnly(Transaction tx) {
+ protected void setRollbackOnly(Transaction tx, Throwable reason) {
try {
- if (tx != null && tx.getStatus() == Status.STATUS_ACTIVE) {
+ if (tx == null || tx.getStatus() != Status.STATUS_ACTIVE) return;
+
+ if (reason == null) {
+
tx.setRollbackOnly();
- txLogger.debug("TX {0}: setRollbackOnly() on transaction {1}", transactionType, tx);
+
+ } else {
+
+ final Method setRollbackOnly = setRollbackOnlyMethod(tx);
+
+ if (setRollbackOnly != null) {
+
+ setRollbackOnly.invoke(tx, reason);
+
+ } else {
+
+ tx.setRollbackOnly();
+
+ }
}
+
+ txLogger.debug("TX {0}: setRollbackOnly() on transaction {1}", transactionType, tx);
+
} catch (Exception e) {
txLogger.error("Exception during setRollbackOnly()", e);
throw new IllegalStateException("No transaction active", e);
}
}
+ private Method setRollbackOnlyMethod(Transaction tx) {
+ try {
+ return tx.getClass().getMethod("setRollbackOnly", Throwable.class);
+ } catch (Throwable e) {
+ return null;
+ }
+ }
+
protected Transaction beginTransaction() throws SystemException {
Transaction transaction;
try {
@@ -252,7 +285,7 @@ public abstract class JtaTransactionPoli
if (tx == null) {
txLogger.debug("TX {0}: No transaction to resume", transactionType);
} else {
- txLogger.debug("TX {0}: Resuming transaction {1}" ,transactionType, tx);
+ txLogger.debug("TX {0}: Resuming transaction {1}", transactionType, tx);
transactionManager.resume(tx);
}
} catch (InvalidTransactionException ite) {
Modified: openejb/branches/openejb-3.2.x/container/openejb-core/src/main/java/org/apache/openejb/core/transaction/TransactionPolicy.java
URL: http://svn.apache.org/viewvc/openejb/branches/openejb-3.2.x/container/openejb-core/src/main/java/org/apache/openejb/core/transaction/TransactionPolicy.java?rev=1141069&r1=1141068&r2=1141069&view=diff
==============================================================================
--- openejb/branches/openejb-3.2.x/container/openejb-core/src/main/java/org/apache/openejb/core/transaction/TransactionPolicy.java (original)
+++ openejb/branches/openejb-3.2.x/container/openejb-core/src/main/java/org/apache/openejb/core/transaction/TransactionPolicy.java Wed Jun 29 12:30:58 2011
@@ -80,6 +80,11 @@ public interface TransactionPolicy {
void setRollbackOnly();
/**
+ * Sets this TransactionPolicy to rollback when completed
+ */
+ void setRollbackOnly(Throwable reason);
+
+ /**
* Commits or rolls back this TransactionPolicy. If there the actual
* transaction is completed or there is no actual transaction, the
* registered TransactionSynchronization are called. Otherwise, the
Modified: openejb/branches/openejb-3.2.x/container/openejb-spring/src/main/java/org/apache/openejb/spring/SpringTransactionPolicy.java
URL: http://svn.apache.org/viewvc/openejb/branches/openejb-3.2.x/container/openejb-spring/src/main/java/org/apache/openejb/spring/SpringTransactionPolicy.java?rev=1141069&r1=1141068&r2=1141069&view=diff
==============================================================================
--- openejb/branches/openejb-3.2.x/container/openejb-spring/src/main/java/org/apache/openejb/spring/SpringTransactionPolicy.java (original)
+++ openejb/branches/openejb-3.2.x/container/openejb-spring/src/main/java/org/apache/openejb/spring/SpringTransactionPolicy.java Wed Jun 29 12:30:58 2011
@@ -99,6 +99,10 @@ public class SpringTransactionPolicy imp
return getTransactionStatus().isRollbackOnly();
}
+ public void setRollbackOnly(Throwable t) {
+ getTransactionStatus().setRollbackOnly();
+ }
+
public void setRollbackOnly() {
getTransactionStatus().setRollbackOnly();
}
Modified: openejb/branches/openejb-3.2.x/pom.xml
URL: http://svn.apache.org/viewvc/openejb/branches/openejb-3.2.x/pom.xml?rev=1141069&r1=1141068&r2=1141069&view=diff
==============================================================================
--- openejb/branches/openejb-3.2.x/pom.xml (original)
+++ openejb/branches/openejb-3.2.x/pom.xml Wed Jun 29 12:30:58 2011
@@ -122,7 +122,7 @@
<junit.version>4.8.1</junit.version>
<org.apache.axis2.version>1.4.1</org.apache.axis2.version>
<org.apache.openwebbeans.version>1.1.0</org.apache.openwebbeans.version>
- <geronimo.connector.version>2.1</geronimo.connector.version>
+ <geronimo.connector.version>2.2.2-SNAPSHOT</geronimo.connector.version>
</properties>
<build>