From ab2cd1133d45d70840c65efd7129e64196a763f4 Mon Sep 17 00:00:00 2001 From: Gary Tully Date: Fri, 6 Aug 2010 17:05:59 +0000 Subject: [PATCH] resolve https://issues.apache.org/activemq/browse/AMQ-2659 - allow XAConnection/Session to be used without an XA transaction, defaults to auto_ack mode. Can still be only used transactionally with an XA transaction git-svn-id: https://svn.apache.org/repos/asf/activemq/trunk@983057 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/activemq/ActiveMQXASession.java | 21 ++++---- .../apache/activemq/JMSXAConsumerTest.java | 50 +++++++++++++++++++ 2 files changed, 59 insertions(+), 12 deletions(-) create mode 100644 activemq-core/src/test/java/org/apache/activemq/JMSXAConsumerTest.java diff --git a/activemq-core/src/main/java/org/apache/activemq/ActiveMQXASession.java b/activemq-core/src/main/java/org/apache/activemq/ActiveMQXASession.java index c4ba17dbde..90b609c131 100755 --- a/activemq-core/src/main/java/org/apache/activemq/ActiveMQXASession.java +++ b/activemq-core/src/main/java/org/apache/activemq/ActiveMQXASession.java @@ -69,7 +69,7 @@ public class ActiveMQXASession extends ActiveMQSession implements QueueSession, } public boolean getTransacted() throws JMSException { - return true; + return getTransactionContext().isInXATransaction(); } public void rollback() throws JMSException { @@ -96,19 +96,16 @@ public class ActiveMQXASession extends ActiveMQSession implements QueueSession, return new ActiveMQTopicSession(this); } - /** - * This is called before transacted work is done by - * the session. XA Work can only be done when this - * XA resource is associated with an Xid. - * - * @throws JMSException not associated with an Xid + /* + * when there is no XA transaction it is auto ack */ + public boolean isAutoAcknowledge() { + return true; + } + protected void doStartTransaction() throws JMSException { - - if (!getTransactionContext().isInXATransaction()) { - throw new JMSException("Session's XAResource has not been enlisted in a distributed transaction."); - } - + // allow non transactional auto ack work on an XASession + // Seems ok by the spec that an XAConnection can be used without an XA tx } } diff --git a/activemq-core/src/test/java/org/apache/activemq/JMSXAConsumerTest.java b/activemq-core/src/test/java/org/apache/activemq/JMSXAConsumerTest.java new file mode 100644 index 0000000000..7deff2732e --- /dev/null +++ b/activemq-core/src/test/java/org/apache/activemq/JMSXAConsumerTest.java @@ -0,0 +1,50 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.activemq; + +import javax.jms.ConnectionFactory; +import junit.framework.Test; + +/* + * allow an XA session to be used as an auto ack session when no XA transaction + * https://issues.apache.org/activemq/browse/AMQ-2659 + */ +public class JMSXAConsumerTest extends JMSConsumerTest { + + public static Test suite() { + return suite(JMSXAConsumerTest.class); + } + + @Override + protected ConnectionFactory createConnectionFactory() throws Exception { + return new ActiveMQXAConnectionFactory("vm://localhost"); + } + + // some tests use transactions, these will not work unless an XA transaction is in place + // slip these + public void testPrefetch1MessageNotDispatched() throws Exception { + } + + public void testRedispatchOfUncommittedTx() throws Exception { + } + + public void testRedispatchOfRolledbackTx() throws Exception { + } + + public void testMessageListenerOnMessageCloseUnackedWithPrefetch1StayInQueue() throws Exception { + } +}