You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@activemq.apache.org by ha...@apache.org on 2014/12/18 00:36:32 UTC

[17/17] activemq git commit: https://issues.apache.org/jira/browse/AMQ-5311 - encode xaErrorCode in xaexception message

https://issues.apache.org/jira/browse/AMQ-5311 - encode xaErrorCode in xaexception message


Project: http://git-wip-us.apache.org/repos/asf/activemq/repo
Commit: http://git-wip-us.apache.org/repos/asf/activemq/commit/b41f9212
Tree: http://git-wip-us.apache.org/repos/asf/activemq/tree/b41f9212
Diff: http://git-wip-us.apache.org/repos/asf/activemq/diff/b41f9212

Branch: refs/heads/activemq-5.10.x
Commit: b41f92127c30f0d185a8c0dde03788b32b270b5e
Parents: 38b3140
Author: gtully <ga...@gmail.com>
Authored: Thu Aug 7 13:42:03 2014 +0100
Committer: Hadrian Zbarcea <ha...@apache.org>
Committed: Wed Dec 17 16:49:06 2014 -0500

----------------------------------------------------------------------
 .../activemq/broker/TransactionBroker.java      |  3 +--
 .../activemq/transaction/XATransaction.java     | 24 +++++++++++---------
 .../org/apache/activemq/TransactionContext.java | 15 ++++++++++--
 .../ActiveMQXAConnectionFactoryTest.java        |  2 +-
 4 files changed, 28 insertions(+), 16 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/activemq/blob/b41f9212/activemq-broker/src/main/java/org/apache/activemq/broker/TransactionBroker.java
----------------------------------------------------------------------
diff --git a/activemq-broker/src/main/java/org/apache/activemq/broker/TransactionBroker.java b/activemq-broker/src/main/java/org/apache/activemq/broker/TransactionBroker.java
index 26ddfab..4b5ff8f 100755
--- a/activemq-broker/src/main/java/org/apache/activemq/broker/TransactionBroker.java
+++ b/activemq-broker/src/main/java/org/apache/activemq/broker/TransactionBroker.java
@@ -365,8 +365,7 @@ public class TransactionBroker extends BrokerFilter {
             return transaction;
         }
         if (xid.isXATransaction()) {
-            XAException e = new XAException("Transaction '" + xid + "' has not been started.");
-            e.errorCode = XAException.XAER_NOTA;
+            XAException e = XATransaction.newXAException("Transaction '" + xid + "' has not been started.", XAException.XAER_NOTA);
             throw e;
         } else {
             throw new JMSException("Transaction '" + xid + "' has not been started.");

http://git-wip-us.apache.org/repos/asf/activemq/blob/b41f9212/activemq-broker/src/main/java/org/apache/activemq/transaction/XATransaction.java
----------------------------------------------------------------------
diff --git a/activemq-broker/src/main/java/org/apache/activemq/transaction/XATransaction.java b/activemq-broker/src/main/java/org/apache/activemq/transaction/XATransaction.java
index 3062125..8e31ec7 100755
--- a/activemq-broker/src/main/java/org/apache/activemq/transaction/XATransaction.java
+++ b/activemq-broker/src/main/java/org/apache/activemq/transaction/XATransaction.java
@@ -19,6 +19,7 @@ package org.apache.activemq.transaction;
 import java.io.IOException;
 import javax.transaction.xa.XAException;
 import javax.transaction.xa.XAResource;
+import org.apache.activemq.TransactionContext;
 import org.apache.activemq.broker.TransactionBroker;
 import org.apache.activemq.command.ConnectionId;
 import org.apache.activemq.command.TransactionId;
@@ -89,23 +90,20 @@ public class XATransaction extends Transaction {
         } catch (Throwable t) {
             LOG.warn("Store COMMIT FAILED: ", t);
             rollback();
-            XAException xae = new XAException("STORE COMMIT FAILED: Transaction rolled back");
-            xae.errorCode = XAException.XA_RBOTHER;
+            XAException xae = newXAException("STORE COMMIT FAILED: Transaction rolled back", XAException.XA_RBOTHER);
             xae.initCause(t);
             throw xae;
         }
     }
 
     private void illegalStateTransition(String callName) throws XAException {
-        XAException xae = new XAException("Cannot call " + callName + " now.");
-        xae.errorCode = XAException.XAER_PROTO;
+        XAException xae = newXAException("Cannot call " + callName + " now.", XAException.XAER_PROTO);
         throw xae;
     }
 
     private void checkForPreparedState(boolean onePhase) throws XAException {
         if (!onePhase) {
-            XAException xae = new XAException("Cannot do 2 phase commit if the transaction has not been prepared");
-            xae.errorCode = XAException.XAER_PROTO;
+            XAException xae = newXAException("Cannot do 2 phase commit if the transaction has not been prepared", XAException.XAER_PROTO);
             throw xae;
         }
     }
@@ -118,8 +116,7 @@ public class XATransaction extends Transaction {
         } catch (Throwable e) {
             LOG.warn("PRE-PREPARE FAILED: ", e);
             rollback();
-            XAException xae = new XAException("PRE-PREPARE FAILED: Transaction rolled back");
-            xae.errorCode = XAException.XA_RBOTHER;
+            XAException xae = newXAException("PRE-PREPARE FAILED: Transaction rolled back", XAException.XA_RBOTHER);
             xae.initCause(e);
             throw xae;
         }
@@ -155,7 +152,7 @@ public class XATransaction extends Transaction {
             doPostRollback();
             break;
         default:
-            throw new XAException("Invalid state");
+            throw newXAException("Invalid state: " + getState(), XAException.XA_RBPROTO);
         }
 
     }
@@ -167,13 +164,18 @@ public class XATransaction extends Transaction {
             // I guess this could happen. Post commit task failed
             // to execute properly.
             LOG.warn("POST ROLLBACK FAILED: ", e);
-            XAException xae = new XAException("POST ROLLBACK FAILED");
-            xae.errorCode = XAException.XAER_RMERR;
+            XAException xae = newXAException("POST ROLLBACK FAILED", XAException.XAER_RMERR);
             xae.initCause(e);
             throw xae;
         }
     }
 
+    public static XAException newXAException(String s, int errorCode) {
+        XAException xaException = new XAException(s + " " + TransactionContext.xaErrorCodeMarker + errorCode);
+        xaException.errorCode = errorCode;
+        return xaException;
+    }
+
     @Override
     public int prepare() throws XAException, IOException {
         if (LOG.isDebugEnabled()) {

http://git-wip-us.apache.org/repos/asf/activemq/blob/b41f9212/activemq-client/src/main/java/org/apache/activemq/TransactionContext.java
----------------------------------------------------------------------
diff --git a/activemq-client/src/main/java/org/apache/activemq/TransactionContext.java b/activemq-client/src/main/java/org/apache/activemq/TransactionContext.java
index c86f448..a444d61 100755
--- a/activemq-client/src/main/java/org/apache/activemq/TransactionContext.java
+++ b/activemq-client/src/main/java/org/apache/activemq/TransactionContext.java
@@ -66,6 +66,7 @@ import org.slf4j.LoggerFactory;
  */
 public class TransactionContext implements XAResource {
 
+    public static final String xaErrorCodeMarker = "xaErrorCode:";
     private static final Logger LOG = LoggerFactory.getLogger(TransactionContext.class);
 
     // XATransactionId -> ArrayList of TransactionContext objects
@@ -786,8 +787,7 @@ public class TransactionContext implements XAResource {
             xae.errorCode = original.errorCode;
             if (xae.errorCode == XA_OK) {
                 // detail not unmarshalled see: org.apache.activemq.openwire.v1.BaseDataStreamMarshaller.createThrowable
-                // so use a valid generic error code in place of ok
-                xae.errorCode = XAException.XAER_RMERR;
+                xae.errorCode = parseFromMessageOr(original.getMessage(), XAException.XAER_RMERR);
             }
             xae.initCause(original);
             return xae;
@@ -799,6 +799,17 @@ public class TransactionContext implements XAResource {
         return xae;
     }
 
+    private int parseFromMessageOr(String message, int fallbackCode) {
+        final String marker = "xaErrorCode:";
+        final int index = message.lastIndexOf(marker);
+        if (index > -1) {
+            try {
+                return Integer.parseInt(message.substring(index + marker.length()));
+            } catch (Exception ignored) {}
+        }
+        return fallbackCode;
+    }
+
     public ActiveMQConnection getConnection() {
         return connection;
     }

http://git-wip-us.apache.org/repos/asf/activemq/blob/b41f9212/activemq-unit-tests/src/test/java/org/apache/activemq/ActiveMQXAConnectionFactoryTest.java
----------------------------------------------------------------------
diff --git a/activemq-unit-tests/src/test/java/org/apache/activemq/ActiveMQXAConnectionFactoryTest.java b/activemq-unit-tests/src/test/java/org/apache/activemq/ActiveMQXAConnectionFactoryTest.java
index 5fd6e5c..4b89851 100644
--- a/activemq-unit-tests/src/test/java/org/apache/activemq/ActiveMQXAConnectionFactoryTest.java
+++ b/activemq-unit-tests/src/test/java/org/apache/activemq/ActiveMQXAConnectionFactoryTest.java
@@ -468,7 +468,7 @@ public class ActiveMQXAConnectionFactoryTest extends CombinationTestSupport {
             fail("Expected xa exception on no tx");
         } catch (XAException expected) {
             LOG.info("got expected xa", expected);
-            assertTrue("not zero", expected.errorCode != XAResource.XA_OK);
+            assertEquals("no tx", XAException.XAER_NOTA, expected.errorCode);
         }
         connection.close();
         broker.stop();