You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by ro...@apache.org on 2015/01/14 16:34:15 UTC

[1/5] qpid-jms git commit: require an explicit clientID be set on the Connection in order to create a DurableSubscriber, preventing their use with auto-generated clientID

Repository: qpid-jms
Updated Branches:
  refs/heads/master 6217cb29a -> b8d40c2c1


require an explicit clientID be set on the Connection in order to create a DurableSubscriber, preventing their use with auto-generated clientID


Project: http://git-wip-us.apache.org/repos/asf/qpid-jms/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-jms/commit/6d2968c6
Tree: http://git-wip-us.apache.org/repos/asf/qpid-jms/tree/6d2968c6
Diff: http://git-wip-us.apache.org/repos/asf/qpid-jms/diff/6d2968c6

Branch: refs/heads/master
Commit: 6d2968c63dc4e98263b56048a5e8fefbf961208e
Parents: 6217cb2
Author: Robert Gemmell <ro...@apache.org>
Authored: Wed Jan 14 11:06:52 2015 +0000
Committer: Robert Gemmell <ro...@apache.org>
Committed: Wed Jan 14 11:06:52 2015 +0000

----------------------------------------------------------------------
 .../java/org/apache/qpid/jms/JmsConnection.java | 11 +++-----
 .../java/org/apache/qpid/jms/JmsSession.java    |  7 +++++
 .../jms/integration/IntegrationTestFixture.java | 10 ++++++--
 .../jms/integration/SessionIntegrationTest.java | 27 ++++++++++++++++++++
 4 files changed, 46 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-jms/blob/6d2968c6/qpid-jms-client/src/main/java/org/apache/qpid/jms/JmsConnection.java
----------------------------------------------------------------------
diff --git a/qpid-jms-client/src/main/java/org/apache/qpid/jms/JmsConnection.java b/qpid-jms-client/src/main/java/org/apache/qpid/jms/JmsConnection.java
index c71e3bc..bc98a85 100644
--- a/qpid-jms-client/src/main/java/org/apache/qpid/jms/JmsConnection.java
+++ b/qpid-jms-client/src/main/java/org/apache/qpid/jms/JmsConnection.java
@@ -231,13 +231,6 @@ public class JmsConnection implements Connection, TopicConnection, QueueConnecti
             destroyResource(connectionInfo);
         }
 
-        synchronized (this) {
-            if (clientIdSet) {
-                connectionInfo.setClientId(null);
-                clientIdSet = false;
-            }
-        }
-
         tempDestinations.clear();
         started.set(false);
         connected.set(false);
@@ -614,6 +607,10 @@ public class JmsConnection implements Connection, TopicConnection, QueueConnecti
         return new JmsTransactionId(connectionInfo.getConnectionId(), transactionIdGenerator.incrementAndGet());
     }
 
+    protected synchronized boolean isExplicitClientID() {
+        return clientIdSet;
+    }
+
     ////////////////////////////////////////////////////////////////////////////
     // Provider interface methods
     ////////////////////////////////////////////////////////////////////////////

http://git-wip-us.apache.org/repos/asf/qpid-jms/blob/6d2968c6/qpid-jms-client/src/main/java/org/apache/qpid/jms/JmsSession.java
----------------------------------------------------------------------
diff --git a/qpid-jms-client/src/main/java/org/apache/qpid/jms/JmsSession.java b/qpid-jms-client/src/main/java/org/apache/qpid/jms/JmsSession.java
index e98f59b..92410dc 100644
--- a/qpid-jms-client/src/main/java/org/apache/qpid/jms/JmsSession.java
+++ b/qpid-jms-client/src/main/java/org/apache/qpid/jms/JmsSession.java
@@ -417,6 +417,7 @@ public class JmsSession implements Session, QueueSession, TopicSession, JmsMessa
     public TopicSubscriber createDurableSubscriber(Topic topic, String name, String messageSelector, boolean noLocal) throws JMSException {
         checkClosed();
         checkDestination(topic);
+        checkClientIDWasSetExplicitly();
         messageSelector = checkSelector(messageSelector);
         JmsDestination dest = JmsMessageTransformation.transformDestination(connection, topic);
         JmsTopicSubscriber result = new JmsDurableTopicSubscriber(getNextConsumerId(), this, dest, name, false, messageSelector);
@@ -424,6 +425,12 @@ public class JmsSession implements Session, QueueSession, TopicSession, JmsMessa
         return result;
     }
 
+    protected void checkClientIDWasSetExplicitly() throws IllegalStateException {
+        if (!connection.isExplicitClientID()) {
+            throw new IllegalStateException("You must specify a unique clientID for the Connection to use a DurableSubscriber");
+        }
+    }
+
     /**
      * @param name
      * @throws JMSException

http://git-wip-us.apache.org/repos/asf/qpid-jms/blob/6d2968c6/qpid-jms-client/src/test/java/org/apache/qpid/jms/integration/IntegrationTestFixture.java
----------------------------------------------------------------------
diff --git a/qpid-jms-client/src/test/java/org/apache/qpid/jms/integration/IntegrationTestFixture.java b/qpid-jms-client/src/test/java/org/apache/qpid/jms/integration/IntegrationTestFixture.java
index 804111c..34fd3cc 100644
--- a/qpid-jms-client/src/test/java/org/apache/qpid/jms/integration/IntegrationTestFixture.java
+++ b/qpid-jms-client/src/test/java/org/apache/qpid/jms/integration/IntegrationTestFixture.java
@@ -49,6 +49,10 @@ public class IntegrationTestFixture {
     }
 
     Connection establishConnecton(TestAmqpPeer testPeer, String optionsString, Symbol[] serverCapabilities, Map<Symbol, Object> serverProperties) throws JMSException {
+        return establishConnecton(testPeer, null, serverCapabilities, serverProperties, true);
+    }
+
+    Connection establishConnecton(TestAmqpPeer testPeer, String optionsString, Symbol[] serverCapabilities, Map<Symbol, Object> serverProperties, boolean setClientId) throws JMSException {
         testPeer.expectPlainConnect("guest", "guest", serverCapabilities, serverProperties);
 
         // Each connection creates a session for managing temporary destinations etc
@@ -63,8 +67,10 @@ public class IntegrationTestFixture {
         ConnectionFactory factory = new JmsConnectionFactory(brokerURI);
         Connection connection = factory.createConnection("guest", "guest");
 
-        // Set a clientId to provoke the actual AMQP connection process to occur.
-        connection.setClientID("clientName");
+        if(setClientId) {
+            // Set a clientId to provoke the actual AMQP connection process to occur.
+            connection.setClientID("clientName");
+        }
 
         assertNull(testPeer.getThrowable());
         return connection;

http://git-wip-us.apache.org/repos/asf/qpid-jms/blob/6d2968c6/qpid-jms-client/src/test/java/org/apache/qpid/jms/integration/SessionIntegrationTest.java
----------------------------------------------------------------------
diff --git a/qpid-jms-client/src/test/java/org/apache/qpid/jms/integration/SessionIntegrationTest.java b/qpid-jms-client/src/test/java/org/apache/qpid/jms/integration/SessionIntegrationTest.java
index 057465f..2610b97 100644
--- a/qpid-jms-client/src/test/java/org/apache/qpid/jms/integration/SessionIntegrationTest.java
+++ b/qpid-jms-client/src/test/java/org/apache/qpid/jms/integration/SessionIntegrationTest.java
@@ -34,6 +34,7 @@ import java.io.IOException;
 
 import javax.jms.Connection;
 import javax.jms.Destination;
+import javax.jms.IllegalStateException;
 import javax.jms.JMSException;
 import javax.jms.Message;
 import javax.jms.MessageConsumer;
@@ -455,6 +456,32 @@ public class SessionIntegrationTest extends QpidJmsTestCase {
     }
 
     @Test(timeout = 5000)
+    public void testCreateDurableTopicSubscriberFailsIfConnectionDoesntHaveExplicitClientID() throws Exception {
+        try (TestAmqpPeer testPeer = new TestAmqpPeer();) {
+            // Create a connection without an explicit clientId
+            Connection connection = testFixture.establishConnecton(testPeer, null, null, null, false);
+            connection.start();
+
+            testPeer.expectBegin(true);
+            Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
+
+            String topicName = "myTopic";
+            Topic dest = session.createTopic(topicName);
+            String subscriptionName = "mySubscription";
+
+            try {
+                // Verify this fails, a clientID is required and only one chosen by the application makes sense
+                session.createDurableSubscriber(dest, subscriptionName);
+                fail("expected exception to be thrown due to lack of explicit clientID");
+            } catch(IllegalStateException ise) {
+                // Expected
+            }
+
+            testPeer.waitForAllHandlersToComplete(1000);
+        }
+    }
+
+    @Test(timeout = 5000)
     public void testCloseDurableTopicSubscriberDetachesWithCloseFalse() throws Exception {
         try (TestAmqpPeer testPeer = new TestAmqpPeer();) {
             Connection connection = testFixture.establishConnecton(testPeer);


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org


[4/5] qpid-jms git commit: allow configuring the clientID via the ConnectionFactory using brokerURI or JNDI properties

Posted by ro...@apache.org.
allow configuring the clientID via the ConnectionFactory using brokerURI or JNDI properties


Project: http://git-wip-us.apache.org/repos/asf/qpid-jms/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-jms/commit/c15320bc
Tree: http://git-wip-us.apache.org/repos/asf/qpid-jms/tree/c15320bc
Diff: http://git-wip-us.apache.org/repos/asf/qpid-jms/diff/c15320bc

Branch: refs/heads/master
Commit: c15320bca153accc733cdbaf4b45e36a9217240e
Parents: 617df63
Author: Robert Gemmell <ro...@apache.org>
Authored: Wed Jan 14 15:05:30 2015 +0000
Committer: Robert Gemmell <ro...@apache.org>
Committed: Wed Jan 14 15:05:30 2015 +0000

----------------------------------------------------------------------
 .../apache/qpid/jms/JmsConnectionFactory.java   | 35 +++++++++++++++++++-
 1 file changed, 34 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-jms/blob/c15320bc/qpid-jms-client/src/main/java/org/apache/qpid/jms/JmsConnectionFactory.java
----------------------------------------------------------------------
diff --git a/qpid-jms-client/src/main/java/org/apache/qpid/jms/JmsConnectionFactory.java b/qpid-jms-client/src/main/java/org/apache/qpid/jms/JmsConnectionFactory.java
index 6a7dcf8..1ec9213 100644
--- a/qpid-jms-client/src/main/java/org/apache/qpid/jms/JmsConnectionFactory.java
+++ b/qpid-jms-client/src/main/java/org/apache/qpid/jms/JmsConnectionFactory.java
@@ -49,11 +49,13 @@ import org.slf4j.LoggerFactory;
 public class JmsConnectionFactory extends JNDIStorable implements ConnectionFactory, QueueConnectionFactory, TopicConnectionFactory {
 
     private static final Logger LOG = LoggerFactory.getLogger(JmsConnectionFactory.class);
+    private static final String CLIENT_ID_PROP = "clientID";
 
     private URI brokerURI;
     private URI localURI;
     private String username;
     private String password;
+    private String clientID;
     private boolean forceAsyncSend;
     private boolean alwaysSyncSend;
     private boolean sendAcksAsync;
@@ -232,11 +234,25 @@ public class JmsConnectionFactory extends JNDIStorable implements ConnectionFact
 
     protected <T extends JmsConnection> T configureConnection(T connection, String username, String password) throws JMSException {
         try {
-            PropertyUtil.setProperties(connection, PropertyUtil.getProperties(this));
+
+            Map<String, String> properties = PropertyUtil.getProperties(this);
+            // We must ensure that we apply the clientID last, since setting it on
+            // the Connection object provokes establishing the underlying connection.
+            boolean setClientID = false;
+            if(properties.containsKey(CLIENT_ID_PROP)) {
+                setClientID = true;
+                properties.remove(CLIENT_ID_PROP);
+            }
+
+            PropertyUtil.setProperties(connection, properties);
             connection.setExceptionListener(exceptionListener);
             connection.setUsername(username);
             connection.setPassword(password);
             connection.setBrokerURI(brokerURI);
+            if(setClientID){
+                connection.setClientID(clientID);
+            }
+
             return connection;
         } catch (Exception e) {
             throw JmsExceptionSupport.create(e);
@@ -542,6 +558,23 @@ public class JmsConnectionFactory extends JNDIStorable implements ConnectionFact
         this.clientIdGenerator = clientIdGenerator;
     }
 
+    public String getClientID() {
+        return clientID;
+    }
+
+    /**
+     * Sets the JMS clientID to use for connections created by this factory.
+     *
+     * NOTE: A clientID can only be used by one Connection at a time, so setting it here
+     * will restrict the ConnectionFactory to creating a single open Connection at a time.
+     * It is possible to set the clientID on the Connection itself immediately after
+     * creation if no value has been set via the factory that created it, which will
+     * allow the factory to create multiple open connections at a time.
+     */
+    public void setClientID(String clientID) {
+        this.clientID = clientID;
+    }
+
     /**
      * Sets the prefix used by connection id generator.
      *


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org


[5/5] qpid-jms git commit: ensure the noLocal flag is passed through to durable subscriber

Posted by ro...@apache.org.
ensure the noLocal flag is passed through to durable subscriber


Project: http://git-wip-us.apache.org/repos/asf/qpid-jms/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-jms/commit/b8d40c2c
Tree: http://git-wip-us.apache.org/repos/asf/qpid-jms/tree/b8d40c2c
Diff: http://git-wip-us.apache.org/repos/asf/qpid-jms/diff/b8d40c2c

Branch: refs/heads/master
Commit: b8d40c2c15f1dea09d29717befc0e43ce9266413
Parents: c15320b
Author: Robert Gemmell <ro...@apache.org>
Authored: Wed Jan 14 15:06:11 2015 +0000
Committer: Robert Gemmell <ro...@apache.org>
Committed: Wed Jan 14 15:06:11 2015 +0000

----------------------------------------------------------------------
 qpid-jms-client/src/main/java/org/apache/qpid/jms/JmsSession.java | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-jms/blob/b8d40c2c/qpid-jms-client/src/main/java/org/apache/qpid/jms/JmsSession.java
----------------------------------------------------------------------
diff --git a/qpid-jms-client/src/main/java/org/apache/qpid/jms/JmsSession.java b/qpid-jms-client/src/main/java/org/apache/qpid/jms/JmsSession.java
index 92410dc..f724f06 100644
--- a/qpid-jms-client/src/main/java/org/apache/qpid/jms/JmsSession.java
+++ b/qpid-jms-client/src/main/java/org/apache/qpid/jms/JmsSession.java
@@ -420,7 +420,7 @@ public class JmsSession implements Session, QueueSession, TopicSession, JmsMessa
         checkClientIDWasSetExplicitly();
         messageSelector = checkSelector(messageSelector);
         JmsDestination dest = JmsMessageTransformation.transformDestination(connection, topic);
-        JmsTopicSubscriber result = new JmsDurableTopicSubscriber(getNextConsumerId(), this, dest, name, false, messageSelector);
+        JmsTopicSubscriber result = new JmsDurableTopicSubscriber(getNextConsumerId(), this, dest, name, noLocal, messageSelector);
         result.init();
         return result;
     }


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org


[3/5] qpid-jms git commit: set a properties key prefix for the connection factory JNDI properties, simplify context factory implementation slightly

Posted by ro...@apache.org.
set a properties key prefix for the connection factory JNDI properties, simplify context factory implementation slightly


Project: http://git-wip-us.apache.org/repos/asf/qpid-jms/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-jms/commit/617df635
Tree: http://git-wip-us.apache.org/repos/asf/qpid-jms/tree/617df635
Diff: http://git-wip-us.apache.org/repos/asf/qpid-jms/diff/617df635

Branch: refs/heads/master
Commit: 617df635efcfea1b65a58b87412e29964a8d8d39
Parents: d2b7e6d
Author: Robert Gemmell <ro...@apache.org>
Authored: Wed Jan 14 11:36:27 2015 +0000
Committer: Robert Gemmell <ro...@apache.org>
Committed: Wed Jan 14 11:36:27 2015 +0000

----------------------------------------------------------------------
 .../qpid/jms/jndi/JmsInitialContextFactory.java | 21 ++++----------------
 1 file changed, 4 insertions(+), 17 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-jms/blob/617df635/qpid-jms-client/src/main/java/org/apache/qpid/jms/jndi/JmsInitialContextFactory.java
----------------------------------------------------------------------
diff --git a/qpid-jms-client/src/main/java/org/apache/qpid/jms/jndi/JmsInitialContextFactory.java b/qpid-jms-client/src/main/java/org/apache/qpid/jms/jndi/JmsInitialContextFactory.java
index 5d30e0e..10583b5 100644
--- a/qpid-jms-client/src/main/java/org/apache/qpid/jms/jndi/JmsInitialContextFactory.java
+++ b/qpid-jms-client/src/main/java/org/apache/qpid/jms/jndi/JmsInitialContextFactory.java
@@ -50,17 +50,12 @@ public class JmsInitialContextFactory implements InitialContextFactory {
     private static final String[] DEFAULT_CONNECTION_FACTORY_NAMES = {
         "ConnectionFactory", "QueueConnectionFactory", "TopicConnectionFactory" };
 
-    private String connectionPrefix = "";
-
-    String queuePrefix = "queue.";
-    String topicPrefix = "topic.";
+    private String connectionFactoryPrefix = "connectionfactory.";
+    private String queuePrefix = "queue.";
+    private String topicPrefix = "topic.";
 
     @Override
     public Context getInitialContext(Hashtable environment) throws NamingException {
-
-        queuePrefix = getValue(environment, "queuePrefix", queuePrefix);
-        topicPrefix = getValue(environment, "topicPrefix", topicPrefix);
-
         // lets create a factory
         Map<String, Object> data = new ConcurrentHashMap<String, Object>();
         String[] names = getConnectionFactoryNames(environment);
@@ -120,7 +115,7 @@ public class JmsInitialContextFactory implements InitialContextFactory {
 
     protected JmsConnectionFactory createConnectionFactory(String name, Hashtable environment) throws URISyntaxException {
         Hashtable temp = new Hashtable(environment);
-        String prefix = connectionPrefix + name + ".";
+        String prefix = connectionFactoryPrefix + name + ".";
         for (Iterator iter = environment.entrySet().iterator(); iter.hasNext();) {
             Map.Entry entry = (Map.Entry) iter.next();
             String key = (String) entry.getKey();
@@ -211,12 +206,4 @@ public class JmsInitialContextFactory implements InitialContextFactory {
         answer.setProperties(properties);
         return answer;
     }
-
-    public String getConnectionPrefix() {
-        return connectionPrefix;
-    }
-
-    public void setConnectionPrefix(String connectionPrefix) {
-        this.connectionPrefix = connectionPrefix;
-    }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org


[2/5] qpid-jms git commit: add some notes for possible cleanup

Posted by ro...@apache.org.
add some notes for possible cleanup


Project: http://git-wip-us.apache.org/repos/asf/qpid-jms/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-jms/commit/d2b7e6d7
Tree: http://git-wip-us.apache.org/repos/asf/qpid-jms/tree/d2b7e6d7
Diff: http://git-wip-us.apache.org/repos/asf/qpid-jms/diff/d2b7e6d7

Branch: refs/heads/master
Commit: d2b7e6d7f5b666b4684ee8f4620201c4e9b8a95a
Parents: 6d2968c
Author: Robert Gemmell <ro...@apache.org>
Authored: Wed Jan 14 11:07:35 2015 +0000
Committer: Robert Gemmell <ro...@apache.org>
Committed: Wed Jan 14 11:07:35 2015 +0000

----------------------------------------------------------------------
 .../src/main/java/org/apache/qpid/jms/JmsConnection.java       | 3 ++-
 .../main/java/org/apache/qpid/jms/meta/JmsConnectionInfo.java  | 6 ++++--
 2 files changed, 6 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-jms/blob/d2b7e6d7/qpid-jms-client/src/main/java/org/apache/qpid/jms/JmsConnection.java
----------------------------------------------------------------------
diff --git a/qpid-jms-client/src/main/java/org/apache/qpid/jms/JmsConnection.java b/qpid-jms-client/src/main/java/org/apache/qpid/jms/JmsConnection.java
index bc98a85..e16b990 100644
--- a/qpid-jms-client/src/main/java/org/apache/qpid/jms/JmsConnection.java
+++ b/qpid-jms-client/src/main/java/org/apache/qpid/jms/JmsConnection.java
@@ -977,10 +977,11 @@ public class JmsConnection implements Connection, TopicConnection, QueueConnecti
         return this.connectionInfo.getConnectionId();
     }
 
+    //TODO: unused? remove?
     public boolean isWatchRemoteDestinations() {
         return this.connectionInfo.isWatchRemoteDestinations();
     }
-
+    //TODO: unused? remove?
     public void setWatchRemoteDestinations(boolean watchRemoteDestinations) {
         this.connectionInfo.setWatchRemoteDestinations(watchRemoteDestinations);
     }

http://git-wip-us.apache.org/repos/asf/qpid-jms/blob/d2b7e6d7/qpid-jms-client/src/main/java/org/apache/qpid/jms/meta/JmsConnectionInfo.java
----------------------------------------------------------------------
diff --git a/qpid-jms-client/src/main/java/org/apache/qpid/jms/meta/JmsConnectionInfo.java b/qpid-jms-client/src/main/java/org/apache/qpid/jms/meta/JmsConnectionInfo.java
index 24a8ba1..fc101af 100644
--- a/qpid-jms-client/src/main/java/org/apache/qpid/jms/meta/JmsConnectionInfo.java
+++ b/qpid-jms-client/src/main/java/org/apache/qpid/jms/meta/JmsConnectionInfo.java
@@ -103,11 +103,11 @@ public final class JmsConnectionInfo implements JmsResource, Comparable<JmsConne
     public void setClientId(String clientId) {
         this.clientId = clientId;
     }
-
+    //TODO: unused? remove?
     public String getClientIp() {
         return clientIp;
     }
-
+    //TODO: unused? remove?
     public void setClientIp(String clientIp) {
         this.clientIp = clientIp;
     }
@@ -184,10 +184,12 @@ public final class JmsConnectionInfo implements JmsResource, Comparable<JmsConne
         this.requestTimeout = requestTimeout;
     }
 
+    //TODO: unused? remove?
     public boolean isWatchRemoteDestinations() {
         return watchRemoteDestinations;
     }
 
+    //TODO: unused? remove?
     public void setWatchRemoteDestinations(boolean watchRemoteDestinations) {
         this.watchRemoteDestinations = watchRemoteDestinations;
     }


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org