You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@activemq.apache.org by gt...@apache.org on 2013/04/02 15:26:08 UTC

svn commit: r1463528 - in /activemq/trunk: activemq-osgi/pom.xml activemq-pool/src/main/java/org/apache/activemq/pool/XaPooledConnectionFactory.java activemq-pool/src/test/java/org/apache/activemq/pool/XAConnectionPoolTest.java

Author: gtully
Date: Tue Apr  2 13:26:08 2013
New Revision: 1463528

URL: http://svn.apache.org/r1463528
Log:
https://issues.apache.org/jira/browse/AMQ-4426 - fix and tests

Modified:
    activemq/trunk/activemq-osgi/pom.xml
    activemq/trunk/activemq-pool/src/main/java/org/apache/activemq/pool/XaPooledConnectionFactory.java
    activemq/trunk/activemq-pool/src/test/java/org/apache/activemq/pool/XAConnectionPoolTest.java

Modified: activemq/trunk/activemq-osgi/pom.xml
URL: http://svn.apache.org/viewvc/activemq/trunk/activemq-osgi/pom.xml?rev=1463528&r1=1463527&r2=1463528&view=diff
==============================================================================
--- activemq/trunk/activemq-osgi/pom.xml (original)
+++ activemq/trunk/activemq-osgi/pom.xml Tue Apr  2 13:26:08 2013
@@ -63,6 +63,7 @@
       javax.jms*,
       javax.management*,
       javax.transaction*,
+      javax.naming*;resolution:=optional,
       org.apache.commons.pool*;resolution:=optional,
       org.apache.commons.net*;resolution:=optional,
       com.sun.syndication*;resolution:=optional,

Modified: activemq/trunk/activemq-pool/src/main/java/org/apache/activemq/pool/XaPooledConnectionFactory.java
URL: http://svn.apache.org/viewvc/activemq/trunk/activemq-pool/src/main/java/org/apache/activemq/pool/XaPooledConnectionFactory.java?rev=1463528&r1=1463527&r2=1463528&view=diff
==============================================================================
--- activemq/trunk/activemq-pool/src/main/java/org/apache/activemq/pool/XaPooledConnectionFactory.java (original)
+++ activemq/trunk/activemq-pool/src/main/java/org/apache/activemq/pool/XaPooledConnectionFactory.java Tue Apr  2 13:26:08 2013
@@ -16,18 +16,53 @@
  */
 package org.apache.activemq.pool;
 
+import java.io.Serializable;
+import java.util.Hashtable;
+import javax.jms.JMSException;
+import javax.jms.QueueConnection;
+import javax.jms.QueueConnectionFactory;
+import javax.jms.TopicConnection;
+import javax.jms.TopicConnectionFactory;
+import javax.naming.Context;
+import javax.naming.InitialContext;
+import javax.naming.Name;
+import javax.naming.spi.ObjectFactory;
 import javax.transaction.TransactionManager;
 
 import org.apache.activemq.ActiveMQConnection;
 import org.apache.activemq.ActiveMQConnectionFactory;
+import org.apache.activemq.util.IntrospectionSupport;
 
 /**
  * A pooled connection factory that automatically enlists
  * sessions in the current active XA transaction if any.
  */
-public class XaPooledConnectionFactory extends PooledConnectionFactory {
+public class XaPooledConnectionFactory extends PooledConnectionFactory implements ObjectFactory, Serializable, QueueConnectionFactory, TopicConnectionFactory
+{
 
     private TransactionManager transactionManager;
+    private boolean tmFromJndi = false;
+    private String tmJndiName = "java:/TransactionManager";
+
+    public String getTmJndiName() {
+        return tmJndiName;
+    }
+
+    public void setTmJndiName(String tmJndiName) {
+        this.tmJndiName = tmJndiName;
+    }
+
+    public boolean isTmFromJndi() {
+        return tmFromJndi;
+    }
+
+    /**
+     * Allow transaction manager resolution from JNDI (ee deployment)
+     * @param tmFromJndi
+     */
+    public void setTmFromJndi(boolean tmFromJndi) {
+        this.tmFromJndi = tmFromJndi;
+    }
 
     public XaPooledConnectionFactory() {
         super();
@@ -42,6 +77,13 @@ public class XaPooledConnectionFactory e
     }
 
     public TransactionManager getTransactionManager() {
+        if (transactionManager == null && tmFromJndi) {
+            try {
+                transactionManager = (TransactionManager) new InitialContext().lookup(getTmJndiName());
+            } catch (Throwable ignored) {
+                ignored.printStackTrace();
+            }
+        }
         return transactionManager;
     }
 
@@ -53,4 +95,33 @@ public class XaPooledConnectionFactory e
     protected ConnectionPool createConnectionPool(ActiveMQConnection connection) {
         return new XaConnectionPool(connection, getTransactionManager());
     }
+
+    @Override
+    public Object getObjectInstance(Object obj, Name name, Context nameCtx, Hashtable<?, ?> environment) throws Exception {
+        setTmFromJndi(true);
+        if (environment != null) {
+            IntrospectionSupport.setProperties(this, environment);
+        }
+        return this;
+    }
+
+    @Override
+    public QueueConnection createQueueConnection() throws JMSException {
+        return (QueueConnection) createConnection();
+    }
+
+    @Override
+    public QueueConnection createQueueConnection(String userName, String password) throws JMSException {
+        return (QueueConnection) createConnection(userName, password);
+    }
+
+    @Override
+    public TopicConnection createTopicConnection() throws JMSException {
+        return (TopicConnection) createConnection();
+    }
+
+    @Override
+    public TopicConnection createTopicConnection(String userName, String password) throws JMSException {
+        return (TopicConnection) createConnection(userName, password);
+    }
 }

Modified: activemq/trunk/activemq-pool/src/test/java/org/apache/activemq/pool/XAConnectionPoolTest.java
URL: http://svn.apache.org/viewvc/activemq/trunk/activemq-pool/src/test/java/org/apache/activemq/pool/XAConnectionPoolTest.java?rev=1463528&r1=1463527&r2=1463528&view=diff
==============================================================================
--- activemq/trunk/activemq-pool/src/test/java/org/apache/activemq/pool/XAConnectionPoolTest.java (original)
+++ activemq/trunk/activemq-pool/src/test/java/org/apache/activemq/pool/XAConnectionPoolTest.java Tue Apr  2 13:26:08 2013
@@ -16,11 +16,15 @@
  */
 package org.apache.activemq.pool;
 
+import java.util.Hashtable;
 import java.util.Vector;
+import javax.jms.QueueConnectionFactory;
 import javax.jms.Session;
 import javax.jms.TopicConnection;
+import javax.jms.TopicConnectionFactory;
 import javax.jms.TopicPublisher;
 import javax.jms.TopicSession;
+import javax.naming.spi.ObjectFactory;
 import javax.transaction.HeuristicMixedException;
 import javax.transaction.HeuristicRollbackException;
 import javax.transaction.InvalidTransactionException;
@@ -140,4 +144,27 @@ public class XAConnectionPoolTest extend
         }
         connection.close();
     }
+
+    public void testInstanceOf() throws  Exception {
+        XaPooledConnectionFactory pcf = new XaPooledConnectionFactory();
+        assertTrue(pcf instanceof QueueConnectionFactory);
+        assertTrue(pcf instanceof TopicConnectionFactory);
+    }
+
+    public void testBindable() throws Exception {
+        XaPooledConnectionFactory pcf = new XaPooledConnectionFactory();
+        assertTrue(pcf  instanceof ObjectFactory);
+        assertTrue(((ObjectFactory)pcf).getObjectInstance(null, null, null, null) instanceof XaPooledConnectionFactory);
+        assertTrue(pcf.isTmFromJndi());
+    }
+
+    public void testBindableEnvOverrides() throws Exception {
+        XaPooledConnectionFactory pcf = new XaPooledConnectionFactory();
+        assertTrue(pcf  instanceof ObjectFactory);
+        Hashtable<String, String> environment = new Hashtable<String, String>();
+        environment.put("tmFromJndi", String.valueOf(Boolean.FALSE));
+        assertTrue(((ObjectFactory) pcf).getObjectInstance(null, null, null, environment) instanceof XaPooledConnectionFactory);
+        assertFalse(pcf.isTmFromJndi());
+    }
+
 }