This closes #1857
This commit is contained in:
commit
58c058f60e
|
@ -90,6 +90,8 @@ public class ActiveMQConnectionFactory extends JNDIStorable implements Connectio
|
||||||
|
|
||||||
private boolean finalizeChecks;
|
private boolean finalizeChecks;
|
||||||
|
|
||||||
|
private boolean ignoreJTA;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void writeExternal(ObjectOutput out) throws IOException {
|
public void writeExternal(ObjectOutput out) throws IOException {
|
||||||
URI uri = toURI();
|
URI uri = toURI();
|
||||||
|
@ -712,6 +714,15 @@ public class ActiveMQConnectionFactory extends JNDIStorable implements Connectio
|
||||||
serverLocator.setInitialMessagePacketSize(size);
|
serverLocator.setInitialMessagePacketSize(size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isIgnoreJTA() {
|
||||||
|
return ignoreJTA;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setIgnoreJTA(boolean ignoreJTA) {
|
||||||
|
checkWrite();
|
||||||
|
this.ignoreJTA = ignoreJTA;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param interceptorList a comma separated string of incoming interceptor class names to be used. Each interceptor needs a default Constructor to be used with this method.
|
* @param interceptorList a comma separated string of incoming interceptor class names to be used. Each interceptor needs a default Constructor to be used with this method.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -268,6 +268,10 @@ public final class ActiveMQRAManagedConnectionFactory implements ManagedConnecti
|
||||||
return ra;
|
return ra;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isIgnoreJTA() {
|
||||||
|
return ra.isIgnoreJTA();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the resource adapter
|
* Set the resource adapter
|
||||||
* <br>
|
* <br>
|
||||||
|
|
|
@ -819,13 +819,12 @@ public final class ActiveMQRASessionFactoryImpl extends ActiveMQConnectionForCon
|
||||||
//from createSession
|
//from createSession
|
||||||
// In a Java EE web or EJB container, when there is an active JTA transaction in progress:
|
// In a Java EE web or EJB container, when there is an active JTA transaction in progress:
|
||||||
//Both arguments {@code transacted} and {@code acknowledgeMode} are ignored.
|
//Both arguments {@code transacted} and {@code acknowledgeMode} are ignored.
|
||||||
if (inJtaTransaction()) {
|
// fix of ARTEMIS-1669 - when a JMSConnectionFactoryDefinition annotation with the transactional attribute set to false="false" is set
|
||||||
|
// then it should not be included in any JTA transaction and behave like that there is no JTA transaction.
|
||||||
|
if (!mcf.isIgnoreJTA() && inJtaTransaction()) {
|
||||||
transacted = true;
|
transacted = true;
|
||||||
//from getAcknowledgeMode
|
//from getAcknowledgeMode
|
||||||
// If the session is not transacted, returns the
|
// If the session is transacted, returns SESSION_TRANSACTED.
|
||||||
// current acknowledgement mode for the session.
|
|
||||||
// If the session
|
|
||||||
// is transacted, returns SESSION_TRANSACTED.
|
|
||||||
acknowledgeMode = Session.SESSION_TRANSACTED;
|
acknowledgeMode = Session.SESSION_TRANSACTED;
|
||||||
} else {
|
} else {
|
||||||
//In the Java EE web or EJB container, when there is no active JTA transaction in progress
|
//In the Java EE web or EJB container, when there is no active JTA transaction in progress
|
||||||
|
|
|
@ -122,6 +122,10 @@ public class ActiveMQResourceAdapter implements ResourceAdapter, Serializable {
|
||||||
|
|
||||||
private String entries;
|
private String entries;
|
||||||
|
|
||||||
|
//fix of ARTEMIS-1669 - propagated value of transactional attribute JMSConnectionFactoryDefinition annotation with the
|
||||||
|
//default value is falso -> original behavior
|
||||||
|
private boolean ignoreJTA;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Keep track of the connection factories that we create so we don't create a bunch of instances of factories
|
* Keep track of the connection factories that we create so we don't create a bunch of instances of factories
|
||||||
* configured the exact same way. Using the same connection factory instance also makes connection load-balancing
|
* configured the exact same way. Using the same connection factory instance also makes connection load-balancing
|
||||||
|
@ -2030,6 +2034,8 @@ public class ActiveMQResourceAdapter implements ResourceAdapter, Serializable {
|
||||||
if (val5 != null) {
|
if (val5 != null) {
|
||||||
cf.setDeserializationWhiteList(val5);
|
cf.setDeserializationWhiteList(val5);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cf.setIgnoreJTA(isIgnoreJTA());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setManagedConnectionFactory(ActiveMQRAManagedConnectionFactory activeMQRAManagedConnectionFactory) {
|
public void setManagedConnectionFactory(ActiveMQRAManagedConnectionFactory activeMQRAManagedConnectionFactory) {
|
||||||
|
@ -2047,4 +2053,12 @@ public class ActiveMQResourceAdapter implements ResourceAdapter, Serializable {
|
||||||
knownConnectionFactories.remove(properties).getA().close();
|
knownConnectionFactories.remove(properties).getA().close();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isIgnoreJTA() {
|
||||||
|
return ignoreJTA;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setIgnoreJTA(boolean ignoreJTA) {
|
||||||
|
this.ignoreJTA = ignoreJTA;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,126 @@
|
||||||
|
/*
|
||||||
|
* 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.artemis.tests.integration.ra;
|
||||||
|
|
||||||
|
import org.apache.activemq.artemis.api.jms.ActiveMQJMSClient;
|
||||||
|
import org.apache.activemq.artemis.core.remoting.impl.invm.InVMConnectorFactory;
|
||||||
|
import org.apache.activemq.artemis.ra.ActiveMQRAConnectionFactory;
|
||||||
|
import org.apache.activemq.artemis.ra.ActiveMQRAConnectionFactoryImpl;
|
||||||
|
import org.apache.activemq.artemis.ra.ActiveMQRAConnectionManager;
|
||||||
|
import org.apache.activemq.artemis.ra.ActiveMQRAManagedConnectionFactory;
|
||||||
|
import org.apache.activemq.artemis.ra.ActiveMQResourceAdapter;
|
||||||
|
import org.apache.activemq.artemis.service.extensions.ServiceUtils;
|
||||||
|
import org.junit.After;
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import javax.jms.IllegalStateException;
|
||||||
|
import javax.jms.Message;
|
||||||
|
import javax.jms.MessageConsumer;
|
||||||
|
import javax.jms.MessageProducer;
|
||||||
|
import javax.jms.Queue;
|
||||||
|
import javax.jms.QueueConnection;
|
||||||
|
import javax.jms.Session;
|
||||||
|
import javax.jms.TextMessage;
|
||||||
|
|
||||||
|
public class IgnoreJTATest extends ActiveMQRATestBase {
|
||||||
|
|
||||||
|
protected ActiveMQResourceAdapter resourceAdapter;
|
||||||
|
protected ActiveMQRAConnectionFactory qraConnectionFactory;
|
||||||
|
protected ActiveMQRAManagedConnectionFactory mcf;
|
||||||
|
ActiveMQRAConnectionManager qraConnectionManager = new ActiveMQRAConnectionManager();
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Before
|
||||||
|
public void setUp() throws Exception {
|
||||||
|
useDummyTransactionManager();
|
||||||
|
super.setUp();
|
||||||
|
|
||||||
|
resourceAdapter = new ActiveMQResourceAdapter();
|
||||||
|
resourceAdapter.setEntries("[\"java://jmsXA\"]");
|
||||||
|
|
||||||
|
resourceAdapter.setConnectorClassName(InVMConnectorFactory.class.getName());
|
||||||
|
MyBootstrapContext ctx = new MyBootstrapContext();
|
||||||
|
resourceAdapter.start(ctx);
|
||||||
|
mcf = new ActiveMQRAManagedConnectionFactory();
|
||||||
|
mcf.setResourceAdapter(resourceAdapter);
|
||||||
|
qraConnectionFactory = new ActiveMQRAConnectionFactoryImpl(mcf, qraConnectionManager);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@After
|
||||||
|
public void tearDown() throws Exception {
|
||||||
|
((DummyTransactionManager) ServiceUtils.getTransactionManager()).tx = null;
|
||||||
|
if (resourceAdapter != null) {
|
||||||
|
resourceAdapter.stop();
|
||||||
|
}
|
||||||
|
|
||||||
|
qraConnectionManager.stop();
|
||||||
|
super.tearDown();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expected = IllegalStateException.class)
|
||||||
|
public void testIgnoreJTA() throws Exception {
|
||||||
|
testSendAndReceive(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testDontIgnoreJTA() throws Exception {
|
||||||
|
testSendAndReceive(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testDefaultIgnoreJTA() throws Exception {
|
||||||
|
testSendAndReceive(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void testSendAndReceive(Boolean ignoreJTA) throws Exception {
|
||||||
|
setDummyTX();
|
||||||
|
setupDLQ(10);
|
||||||
|
resourceAdapter = newResourceAdapter();
|
||||||
|
if (ignoreJTA != null) {
|
||||||
|
resourceAdapter.setIgnoreJTA(ignoreJTA);
|
||||||
|
}
|
||||||
|
MyBootstrapContext ctx = new MyBootstrapContext();
|
||||||
|
resourceAdapter.start(ctx);
|
||||||
|
ActiveMQRAManagedConnectionFactory mcf = new ActiveMQRAManagedConnectionFactory();
|
||||||
|
mcf.setResourceAdapter(resourceAdapter);
|
||||||
|
ActiveMQRAConnectionFactory qraConnectionFactory = new ActiveMQRAConnectionFactoryImpl(mcf, qraConnectionManager);
|
||||||
|
QueueConnection queueConnection = qraConnectionFactory.createQueueConnection();
|
||||||
|
Session s = queueConnection.createSession(true, Session.AUTO_ACKNOWLEDGE);
|
||||||
|
Queue q = ActiveMQJMSClient.createQueue(MDBQUEUE);
|
||||||
|
MessageProducer mp = s.createProducer(q);
|
||||||
|
MessageConsumer consumer = s.createConsumer(q);
|
||||||
|
Message message = s.createTextMessage("test");
|
||||||
|
mp.send(message);
|
||||||
|
s.commit();
|
||||||
|
queueConnection.start();
|
||||||
|
TextMessage textMessage = (TextMessage) consumer.receive(1000);
|
||||||
|
assertNotNull(textMessage);
|
||||||
|
assertEquals(textMessage.getText(), "test");
|
||||||
|
s.rollback();
|
||||||
|
textMessage = (TextMessage) consumer.receive(1000);
|
||||||
|
assertNotNull(textMessage);
|
||||||
|
assertEquals(textMessage.getText(), "test");
|
||||||
|
s.commit();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setDummyTX() {
|
||||||
|
((DummyTransactionManager) ServiceUtils.getTransactionManager()).tx = new DummyTransaction();
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue