You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@activemq.apache.org by cl...@apache.org on 2018/03/06 23:45:57 UTC
[1/2] activemq-artemis git commit: This closes #1857
Repository: activemq-artemis
Updated Branches:
refs/heads/master cc4a13a37 -> 58c058f60
This closes #1857
Project: http://git-wip-us.apache.org/repos/asf/activemq-artemis/repo
Commit: http://git-wip-us.apache.org/repos/asf/activemq-artemis/commit/58c058f6
Tree: http://git-wip-us.apache.org/repos/asf/activemq-artemis/tree/58c058f6
Diff: http://git-wip-us.apache.org/repos/asf/activemq-artemis/diff/58c058f6
Branch: refs/heads/master
Commit: 58c058f60e7f493a836823e319c39daec2419494
Parents: cc4a13a 65ccfb2
Author: Clebert Suconic <cl...@apache.org>
Authored: Tue Mar 6 18:45:51 2018 -0500
Committer: Clebert Suconic <cl...@apache.org>
Committed: Tue Mar 6 18:45:51 2018 -0500
----------------------------------------------------------------------
.../jms/client/ActiveMQConnectionFactory.java | 11 ++
.../ra/ActiveMQRAManagedConnectionFactory.java | 4 +
.../ra/ActiveMQRASessionFactoryImpl.java | 9 +-
.../artemis/ra/ActiveMQResourceAdapter.java | 14 +++
.../tests/integration/ra/IgnoreJTATest.java | 126 +++++++++++++++++++
5 files changed, 159 insertions(+), 5 deletions(-)
----------------------------------------------------------------------
[2/2] activemq-artemis git commit: ARTEMIS-1669 JMS message is not
received when using a non-transactional JMSConnectionFactoryDefinition
Posted by cl...@apache.org.
ARTEMIS-1669 JMS message is not received when using a non-transactional JMSConnectionFactoryDefinition
Project: http://git-wip-us.apache.org/repos/asf/activemq-artemis/repo
Commit: http://git-wip-us.apache.org/repos/asf/activemq-artemis/commit/65ccfb28
Tree: http://git-wip-us.apache.org/repos/asf/activemq-artemis/tree/65ccfb28
Diff: http://git-wip-us.apache.org/repos/asf/activemq-artemis/diff/65ccfb28
Branch: refs/heads/master
Commit: 65ccfb2838cb443beed3bee1e6fbdca3c4ed10a7
Parents: cc4a13a
Author: JiriOndrusek <jo...@redhat.com>
Authored: Thu Feb 8 12:47:10 2018 +0100
Committer: Clebert Suconic <cl...@apache.org>
Committed: Tue Mar 6 18:45:51 2018 -0500
----------------------------------------------------------------------
.../jms/client/ActiveMQConnectionFactory.java | 11 ++
.../ra/ActiveMQRAManagedConnectionFactory.java | 4 +
.../ra/ActiveMQRASessionFactoryImpl.java | 9 +-
.../artemis/ra/ActiveMQResourceAdapter.java | 14 +++
.../tests/integration/ra/IgnoreJTATest.java | 126 +++++++++++++++++++
5 files changed, 159 insertions(+), 5 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/65ccfb28/artemis-jms-client/src/main/java/org/apache/activemq/artemis/jms/client/ActiveMQConnectionFactory.java
----------------------------------------------------------------------
diff --git a/artemis-jms-client/src/main/java/org/apache/activemq/artemis/jms/client/ActiveMQConnectionFactory.java b/artemis-jms-client/src/main/java/org/apache/activemq/artemis/jms/client/ActiveMQConnectionFactory.java
index aad68a9..2ab3bf7 100644
--- a/artemis-jms-client/src/main/java/org/apache/activemq/artemis/jms/client/ActiveMQConnectionFactory.java
+++ b/artemis-jms-client/src/main/java/org/apache/activemq/artemis/jms/client/ActiveMQConnectionFactory.java
@@ -90,6 +90,8 @@ public class ActiveMQConnectionFactory extends JNDIStorable implements Connectio
private boolean finalizeChecks;
+ private boolean ignoreJTA;
+
@Override
public void writeExternal(ObjectOutput out) throws IOException {
URI uri = toURI();
@@ -712,6 +714,15 @@ public class ActiveMQConnectionFactory extends JNDIStorable implements Connectio
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.
*/
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/65ccfb28/artemis-ra/src/main/java/org/apache/activemq/artemis/ra/ActiveMQRAManagedConnectionFactory.java
----------------------------------------------------------------------
diff --git a/artemis-ra/src/main/java/org/apache/activemq/artemis/ra/ActiveMQRAManagedConnectionFactory.java b/artemis-ra/src/main/java/org/apache/activemq/artemis/ra/ActiveMQRAManagedConnectionFactory.java
index 96ce33a..ef5698b 100644
--- a/artemis-ra/src/main/java/org/apache/activemq/artemis/ra/ActiveMQRAManagedConnectionFactory.java
+++ b/artemis-ra/src/main/java/org/apache/activemq/artemis/ra/ActiveMQRAManagedConnectionFactory.java
@@ -268,6 +268,10 @@ public final class ActiveMQRAManagedConnectionFactory implements ManagedConnecti
return ra;
}
+ public boolean isIgnoreJTA() {
+ return ra.isIgnoreJTA();
+ }
+
/**
* Set the resource adapter
* <br>
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/65ccfb28/artemis-ra/src/main/java/org/apache/activemq/artemis/ra/ActiveMQRASessionFactoryImpl.java
----------------------------------------------------------------------
diff --git a/artemis-ra/src/main/java/org/apache/activemq/artemis/ra/ActiveMQRASessionFactoryImpl.java b/artemis-ra/src/main/java/org/apache/activemq/artemis/ra/ActiveMQRASessionFactoryImpl.java
index 12d6ae2..0716bac 100644
--- a/artemis-ra/src/main/java/org/apache/activemq/artemis/ra/ActiveMQRASessionFactoryImpl.java
+++ b/artemis-ra/src/main/java/org/apache/activemq/artemis/ra/ActiveMQRASessionFactoryImpl.java
@@ -819,13 +819,12 @@ public final class ActiveMQRASessionFactoryImpl extends ActiveMQConnectionForCon
//from createSession
// 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.
- 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;
//from getAcknowledgeMode
- // If the session is not transacted, returns the
- // current acknowledgement mode for the session.
- // If the session
- // is transacted, returns SESSION_TRANSACTED.
+ // If the session is transacted, returns SESSION_TRANSACTED.
acknowledgeMode = Session.SESSION_TRANSACTED;
} else {
//In the Java EE web or EJB container, when there is no active JTA transaction in progress
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/65ccfb28/artemis-ra/src/main/java/org/apache/activemq/artemis/ra/ActiveMQResourceAdapter.java
----------------------------------------------------------------------
diff --git a/artemis-ra/src/main/java/org/apache/activemq/artemis/ra/ActiveMQResourceAdapter.java b/artemis-ra/src/main/java/org/apache/activemq/artemis/ra/ActiveMQResourceAdapter.java
index 684792e..b40ef59 100644
--- a/artemis-ra/src/main/java/org/apache/activemq/artemis/ra/ActiveMQResourceAdapter.java
+++ b/artemis-ra/src/main/java/org/apache/activemq/artemis/ra/ActiveMQResourceAdapter.java
@@ -122,6 +122,10 @@ public class ActiveMQResourceAdapter implements ResourceAdapter, Serializable {
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
* 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) {
cf.setDeserializationWhiteList(val5);
}
+
+ cf.setIgnoreJTA(isIgnoreJTA());
}
public void setManagedConnectionFactory(ActiveMQRAManagedConnectionFactory activeMQRAManagedConnectionFactory) {
@@ -2047,4 +2053,12 @@ public class ActiveMQResourceAdapter implements ResourceAdapter, Serializable {
knownConnectionFactories.remove(properties).getA().close();
}
}
+
+ public boolean isIgnoreJTA() {
+ return ignoreJTA;
+ }
+
+ public void setIgnoreJTA(boolean ignoreJTA) {
+ this.ignoreJTA = ignoreJTA;
+ }
}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/65ccfb28/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/ra/IgnoreJTATest.java
----------------------------------------------------------------------
diff --git a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/ra/IgnoreJTATest.java b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/ra/IgnoreJTATest.java
new file mode 100644
index 0000000..c4a6b62
--- /dev/null
+++ b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/ra/IgnoreJTATest.java
@@ -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();
+ }
+}