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();
+   }
+}