[jboss-svn-commits] JBL Code SVN: r10754 - in labs/jbosstm/trunk: ArjunaJTA/jta/classes/com/arjuna/ats/internal/jta/resources/arjunacore and 1 other directories.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Wed Apr 4 09:02:49 EDT 2007
Author: jhalliday
Date: 2007-04-04 09:02:49 -0400 (Wed, 04 Apr 2007)
New Revision: 10754
Modified:
labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/arjuna/coordinator/TwoPhaseCoordinator.java
labs/jbosstm/trunk/ArjunaJTA/jta/classes/com/arjuna/ats/internal/jta/resources/arjunacore/SynchronizationImple.java
labs/jbosstm/trunk/ArjunaJTA/jta/classes/com/arjuna/ats/internal/jta/transaction/arjunacore/TransactionImple.java
Log:
Improved handling of exceptions generated during beforeCompletion synchronization processing, per JBAS-4238
Modified: labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/arjuna/coordinator/TwoPhaseCoordinator.java
===================================================================
--- labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/arjuna/coordinator/TwoPhaseCoordinator.java 2007-04-04 12:22:52 UTC (rev 10753)
+++ labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/arjuna/coordinator/TwoPhaseCoordinator.java 2007-04-04 13:02:49 UTC (rev 10754)
@@ -177,6 +177,14 @@
return "/StateManager/BasicAction/AtomicAction/TwoPhaseCoordinator";
}
+ /**
+ * Get any Throwable that was caught during commit processing but not directly rethrown.
+ * @return
+ */
+ public Throwable getDeferredThrowable() {
+ return _deferredThrowable;
+ }
+
protected TwoPhaseCoordinator (int at)
{
super(at);
@@ -239,17 +247,28 @@
try
{
problem = !_currentRecord.beforeCompletion();
+
+ // if something goes wrong, we can't just throw the exception, we need to continue to
+ // complete the transaction. However, the exception may have interesting information that
+ // we want later, so we keep a reference to it as well as logging it.
+
}
catch (Exception ex)
{
tsLogger.arjLoggerI18N.warn("com.arjuna.ats.arjuna.coordinator.TwoPhaseCoordinator_2", new Object[]
{ _currentRecord }, ex);
+ if(_deferredThrowable == null) {
+ _deferredThrowable = ex;
+ }
problem = true;
}
catch (Error er)
{
tsLogger.arjLoggerI18N.warn("com.arjuna.ats.arjuna.coordinator.TwoPhaseCoordinator_2", new Object[]
{ _currentRecord }, er);
+ if(_deferredThrowable == null) {
+ _deferredThrowable = er;
+ }
problem = true;
}
}
@@ -352,5 +371,5 @@
//private HashList _synchs;
private SortedSet _synchs;
private SynchronizationRecord _currentRecord; // the most recently processed Synchronization.
-
+ private Throwable _deferredThrowable;
}
Modified: labs/jbosstm/trunk/ArjunaJTA/jta/classes/com/arjuna/ats/internal/jta/resources/arjunacore/SynchronizationImple.java
===================================================================
--- labs/jbosstm/trunk/ArjunaJTA/jta/classes/com/arjuna/ats/internal/jta/resources/arjunacore/SynchronizationImple.java 2007-04-04 12:22:52 UTC (rev 10753)
+++ labs/jbosstm/trunk/ArjunaJTA/jta/classes/com/arjuna/ats/internal/jta/resources/arjunacore/SynchronizationImple.java 2007-04-04 13:02:49 UTC (rev 10754)
@@ -111,16 +111,9 @@
if (_theSynch != null)
{
- try
- {
_theSynch.beforeCompletion();
-
return true;
- }
- catch (Exception e)
- {
- return false;
- }
+ // Don't catch and swallow unchecked exceptions here, they may be useful to the caller.
}
else
return false;
Modified: labs/jbosstm/trunk/ArjunaJTA/jta/classes/com/arjuna/ats/internal/jta/transaction/arjunacore/TransactionImple.java
===================================================================
--- labs/jbosstm/trunk/ArjunaJTA/jta/classes/com/arjuna/ats/internal/jta/transaction/arjunacore/TransactionImple.java 2007-04-04 12:22:52 UTC (rev 10753)
+++ labs/jbosstm/trunk/ArjunaJTA/jta/classes/com/arjuna/ats/internal/jta/transaction/arjunacore/TransactionImple.java 2007-04-04 13:02:49 UTC (rev 10754)
@@ -48,10 +48,7 @@
import com.arjuna.ats.jta.xa.XAModifier;
import com.arjuna.ats.arjuna.LastResourceRecord;
-import com.arjuna.ats.arjuna.coordinator.AbstractRecord;
-import com.arjuna.ats.arjuna.coordinator.ActionStatus;
-import com.arjuna.ats.arjuna.coordinator.BasicAction;
-import com.arjuna.ats.arjuna.coordinator.AddOutcome;
+import com.arjuna.ats.arjuna.coordinator.*;
import com.arjuna.ats.arjuna.common.*;
import com.arjuna.common.util.logging.*;
@@ -243,8 +240,11 @@
throw new javax.transaction.HeuristicMixedException();
case ActionStatus.H_ROLLBACK:
case ActionStatus.ABORTED:
- throw new RollbackException(
- jtaLogger.logMesg.getString("com.arjuna.ats.internal.jta.transaction.arjunacore.commitwhenaborted"));
+ RollbackException rollbackException = new RollbackException(jtaLogger.logMesg.getString("com.arjuna.ats.internal.jta.transaction.arjunacore.commitwhenaborted"));
+ if(_theTransaction.getDeferredThrowable() != null) {
+ rollbackException.initCause(_theTransaction.getDeferredThrowable());
+ }
+ throw rollbackException;
default:
throw new IllegalStateException(
jtaLogger.logMesg.getString("com.arjuna.ats.internal.jta.transaction.arjunacore.invalidstate"));
@@ -1264,8 +1264,11 @@
throw new javax.transaction.HeuristicMixedException();
case ActionStatus.H_ROLLBACK:
case ActionStatus.ABORTED:
- throw new RollbackException(
- jtaLogger.logMesg.getString("com.arjuna.ats.internal.jta.transaction.arjunacore.commitwhenaborted"));
+ RollbackException rollbackException = new RollbackException(jtaLogger.logMesg.getString("com.arjuna.ats.internal.jta.transaction.arjunacore.commitwhenaborted"));
+ if(_theTransaction.getDeferredThrowable() != null) {
+ rollbackException.initCause(_theTransaction.getDeferredThrowable());
+ }
+ throw rollbackException;
default:
throw new IllegalStateException(
jtaLogger.logMesg.getString("com.arjuna.ats.internal.jta.transaction.arjunacore.invalidstate"));
More information about the jboss-svn-commits
mailing list