use valid error code (in place of xa_ok) for xaexceptions in the absense of marshalled exception content from the broker

git-svn-id: https://svn.apache.org/repos/asf/activemq/trunk@1515783 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Gary Tully 2013-08-20 11:21:43 +00:00
parent 25a1dd071a
commit f155083a61
2 changed files with 29 additions and 1 deletions

View File

@ -772,6 +772,11 @@ public class TransactionContext implements XAResource {
XAException original = (XAException)e.getCause();
XAException xae = new XAException(original.getMessage());
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.initCause(original);
return xae;
}

View File

@ -411,12 +411,35 @@ public class ActiveMQXAConnectionFactoryTest extends CombinationTestSupport {
} catch (javax.jms.IllegalStateException expected) {}
}
public void testRollbackXaErrorCode() throws Exception {
String brokerName = "rollbackErrorCode";
BrokerService broker = BrokerFactory.createBroker(new URI("broker:(tcp://localhost:0)/" + brokerName));
broker.start();
broker.waitUntilStarted();
ActiveMQXAConnectionFactory cf = new ActiveMQXAConnectionFactory(broker.getTransportConnectors().get(0).getConnectUri());
XAConnection connection = (XAConnection)cf.createConnection();
connection.start();
XASession session = connection.createXASession();
XAResource resource = session.getXAResource();
Xid tid = createXid();
try {
resource.rollback(tid);
fail("Expected xa exception on no tx");
} catch (XAException expected) {
LOG.info("got expected xa", expected);
assertTrue("not zero", expected.errorCode != XAResource.XA_OK);
}
connection.close();
broker.stop();
}
private void assertTransactionGoneFromFailoverState(
ActiveMQXAConnection connection1, Xid tid) throws Exception {
FailoverTransport transport = (FailoverTransport) connection1.getTransport().narrow(FailoverTransport.class);
TransactionInfo info = new TransactionInfo(connection1.getConnectionInfo().getConnectionId(), new XATransactionId(tid), TransactionInfo.COMMIT_ONE_PHASE);
assertNull("transaction shold not exist in the state tracker",
assertNull("transaction should not exist in the state tracker",
transport.getStateTracker().processCommitTransactionOnePhase(info));
}