mirror of https://github.com/apache/activemq.git
patch applied for https://issues.apache.org/activemq/browse/AMQ-2191
git-svn-id: https://svn.apache.org/repos/asf/activemq/trunk@813927 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
42282810a8
commit
e01acf44ca
|
@ -16,6 +16,7 @@
|
||||||
*/
|
*/
|
||||||
package org.apache.activemq;
|
package org.apache.activemq;
|
||||||
|
|
||||||
|
import java.io.InterruptedIOException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
@ -27,11 +28,13 @@ import javax.transaction.xa.XAException;
|
||||||
import javax.transaction.xa.XAResource;
|
import javax.transaction.xa.XAResource;
|
||||||
import javax.transaction.xa.Xid;
|
import javax.transaction.xa.Xid;
|
||||||
|
|
||||||
|
import org.apache.activemq.command.Command;
|
||||||
import org.apache.activemq.command.ConnectionId;
|
import org.apache.activemq.command.ConnectionId;
|
||||||
import org.apache.activemq.command.DataArrayResponse;
|
import org.apache.activemq.command.DataArrayResponse;
|
||||||
import org.apache.activemq.command.DataStructure;
|
import org.apache.activemq.command.DataStructure;
|
||||||
import org.apache.activemq.command.IntegerResponse;
|
import org.apache.activemq.command.IntegerResponse;
|
||||||
import org.apache.activemq.command.LocalTransactionId;
|
import org.apache.activemq.command.LocalTransactionId;
|
||||||
|
import org.apache.activemq.command.Response;
|
||||||
import org.apache.activemq.command.TransactionId;
|
import org.apache.activemq.command.TransactionId;
|
||||||
import org.apache.activemq.command.TransactionInfo;
|
import org.apache.activemq.command.TransactionInfo;
|
||||||
import org.apache.activemq.command.XATransactionId;
|
import org.apache.activemq.command.XATransactionId;
|
||||||
|
@ -280,7 +283,7 @@ public class TransactionContext implements XAResource {
|
||||||
TransactionInfo info = new TransactionInfo(getConnectionId(), transactionId, TransactionInfo.COMMIT_ONE_PHASE);
|
TransactionInfo info = new TransactionInfo(getConnectionId(), transactionId, TransactionInfo.COMMIT_ONE_PHASE);
|
||||||
this.transactionId = null;
|
this.transactionId = null;
|
||||||
// Notify the listener that the tx was committed back
|
// Notify the listener that the tx was committed back
|
||||||
this.connection.syncSendPacket(info);
|
syncSendPacketWithInterruptionHandling(info);
|
||||||
if (localTransactionEventListener != null) {
|
if (localTransactionEventListener != null) {
|
||||||
localTransactionEventListener.commitEvent();
|
localTransactionEventListener.commitEvent();
|
||||||
}
|
}
|
||||||
|
@ -399,7 +402,7 @@ public class TransactionContext implements XAResource {
|
||||||
TransactionInfo info = new TransactionInfo(getConnectionId(), x, TransactionInfo.PREPARE);
|
TransactionInfo info = new TransactionInfo(getConnectionId(), x, TransactionInfo.PREPARE);
|
||||||
|
|
||||||
// Find out if the server wants to commit or rollback.
|
// Find out if the server wants to commit or rollback.
|
||||||
IntegerResponse response = (IntegerResponse)this.connection.syncSendPacket(info);
|
IntegerResponse response = (IntegerResponse)syncSendPacketWithInterruptionHandling(info);
|
||||||
return response.getResult();
|
return response.getResult();
|
||||||
|
|
||||||
} catch (JMSException e) {
|
} catch (JMSException e) {
|
||||||
|
@ -433,7 +436,7 @@ public class TransactionContext implements XAResource {
|
||||||
|
|
||||||
// Let the server know that the tx is rollback.
|
// Let the server know that the tx is rollback.
|
||||||
TransactionInfo info = new TransactionInfo(getConnectionId(), x, TransactionInfo.ROLLBACK);
|
TransactionInfo info = new TransactionInfo(getConnectionId(), x, TransactionInfo.ROLLBACK);
|
||||||
this.connection.syncSendPacket(info);
|
syncSendPacketWithInterruptionHandling(info);
|
||||||
|
|
||||||
List<TransactionContext> l = ENDED_XA_TRANSACTION_CONTEXTS.remove(x);
|
List<TransactionContext> l = ENDED_XA_TRANSACTION_CONTEXTS.remove(x);
|
||||||
if (l != null && !l.isEmpty()) {
|
if (l != null && !l.isEmpty()) {
|
||||||
|
@ -472,7 +475,7 @@ public class TransactionContext implements XAResource {
|
||||||
// Notify the server that the tx was committed back
|
// Notify the server that the tx was committed back
|
||||||
TransactionInfo info = new TransactionInfo(getConnectionId(), x, onePhase ? TransactionInfo.COMMIT_ONE_PHASE : TransactionInfo.COMMIT_TWO_PHASE);
|
TransactionInfo info = new TransactionInfo(getConnectionId(), x, onePhase ? TransactionInfo.COMMIT_ONE_PHASE : TransactionInfo.COMMIT_TWO_PHASE);
|
||||||
|
|
||||||
this.connection.syncSendPacket(info);
|
syncSendPacketWithInterruptionHandling(info);
|
||||||
|
|
||||||
List<TransactionContext> l = ENDED_XA_TRANSACTION_CONTEXTS.remove(x);
|
List<TransactionContext> l = ENDED_XA_TRANSACTION_CONTEXTS.remove(x);
|
||||||
if (l != null && !l.isEmpty()) {
|
if (l != null && !l.isEmpty()) {
|
||||||
|
@ -509,7 +512,7 @@ public class TransactionContext implements XAResource {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
// Tell the server to forget the transaction.
|
// Tell the server to forget the transaction.
|
||||||
this.connection.syncSendPacket(info);
|
syncSendPacketWithInterruptionHandling(info);
|
||||||
} catch (JMSException e) {
|
} catch (JMSException e) {
|
||||||
throw toXAException(e);
|
throw toXAException(e);
|
||||||
}
|
}
|
||||||
|
@ -601,7 +604,7 @@ public class TransactionContext implements XAResource {
|
||||||
if (transactionId != null) {
|
if (transactionId != null) {
|
||||||
TransactionInfo info = new TransactionInfo(connectionId, transactionId, TransactionInfo.END);
|
TransactionInfo info = new TransactionInfo(connectionId, transactionId, TransactionInfo.END);
|
||||||
try {
|
try {
|
||||||
this.connection.syncSendPacket(info);
|
syncSendPacketWithInterruptionHandling(info);
|
||||||
if (LOG.isDebugEnabled()) {
|
if (LOG.isDebugEnabled()) {
|
||||||
LOG.debug("Ended XA transaction: " + transactionId);
|
LOG.debug("Ended XA transaction: " + transactionId);
|
||||||
}
|
}
|
||||||
|
@ -627,6 +630,31 @@ public class TransactionContext implements XAResource {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sends the given command. Also sends the command in case of interruption,
|
||||||
|
* so that important commands like rollback and commit are never interrupted.
|
||||||
|
* If interruption occurred, set the interruption state of the current
|
||||||
|
* after performing the action again.
|
||||||
|
*
|
||||||
|
* @return the response
|
||||||
|
*/
|
||||||
|
private Response syncSendPacketWithInterruptionHandling(Command command) throws JMSException {
|
||||||
|
try {
|
||||||
|
return this.connection.syncSendPacket(command);
|
||||||
|
} catch (JMSException e) {
|
||||||
|
if (e.getLinkedException() instanceof InterruptedIOException) {
|
||||||
|
try {
|
||||||
|
Thread.interrupted();
|
||||||
|
return this.connection.syncSendPacket(command);
|
||||||
|
} finally {
|
||||||
|
Thread.currentThread().interrupt();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Converts a JMSException from the server to an XAException. if the
|
* Converts a JMSException from the server to an XAException. if the
|
||||||
* JMSException contained a linked XAException that is returned instead.
|
* JMSException contained a linked XAException that is returned instead.
|
||||||
|
|
Loading…
Reference in New Issue