ARTEMIS-1206 SetClientID from Core ConnectionFactory is not unique
Project: http://git-wip-us.apache.org/repos/asf/activemq-artemis/repo Commit: http://git-wip-us.apache.org/repos/asf/activemq-artemis/commit/545414c1 Tree: http://git-wip-us.apache.org/repos/asf/activemq-artemis/tree/545414c1 Diff: http://git-wip-us.apache.org/repos/asf/activemq-artemis/diff/545414c1 Branch: refs/heads/master Commit: 545414c18b0109f4c0ff4877be3d3e090b7c9586 Parents: 9d5d2d5 Author: Clebert Suconic <[email protected]> Authored: Tue Jun 6 12:58:28 2017 -0400 Committer: Clebert Suconic <[email protected]> Committed: Wed Jun 7 15:03:59 2017 -0400 ---------------------------------------------------------------------- .../artemis/jms/client/ActiveMQConnection.java | 22 +++++++++----- .../integration/jms/client/ConnectionTest.java | 30 ++++++++++++++++++++ 2 files changed, 45 insertions(+), 7 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/545414c1/artemis-jms-client/src/main/java/org/apache/activemq/artemis/jms/client/ActiveMQConnection.java ---------------------------------------------------------------------- diff --git a/artemis-jms-client/src/main/java/org/apache/activemq/artemis/jms/client/ActiveMQConnection.java b/artemis-jms-client/src/main/java/org/apache/activemq/artemis/jms/client/ActiveMQConnection.java index 0ff0a21..6432af2 100644 --- a/artemis-jms-client/src/main/java/org/apache/activemq/artemis/jms/client/ActiveMQConnection.java +++ b/artemis-jms-client/src/main/java/org/apache/activemq/artemis/jms/client/ActiveMQConnection.java @@ -242,13 +242,7 @@ public class ActiveMQConnection extends ActiveMQConnectionForContextImpl impleme throw new IllegalStateException("setClientID can only be called directly after the connection is created"); } - try { - initialSession.addUniqueMetaData(ClientSession.JMS_SESSION_CLIENT_ID_PROPERTY, clientID); - } catch (ActiveMQException e) { - if (e.getType() == ActiveMQExceptionType.DUPLICATE_METADATA) { - throw new InvalidClientIDException("clientID=" + clientID + " was already set into another connection"); - } - } + validateClientID(initialSession, clientID); this.clientID = clientID; try { @@ -263,6 +257,16 @@ public class ActiveMQConnection extends ActiveMQConnectionForContextImpl impleme justCreated = false; } + private void validateClientID(ClientSession validateSession, String clientID) throws InvalidClientIDException { + try { + validateSession.addUniqueMetaData(ClientSession.JMS_SESSION_CLIENT_ID_PROPERTY, clientID); + } catch (ActiveMQException e) { + if (e.getType() == ActiveMQExceptionType.DUPLICATE_METADATA) { + throw new InvalidClientIDException("clientID=" + clientID + " was already set into another connection"); + } + } + } + @Override public ConnectionMetaData getMetaData() throws JMSException { checkClosed(); @@ -669,6 +673,10 @@ public class ActiveMQConnection extends ActiveMQConnectionForContextImpl impleme try { initialSession = sessionFactory.createSession(username, password, false, false, false, false, 0); + if (clientID != null) { + validateClientID(initialSession, clientID); + } + addSessionMetaData(initialSession); initialSession.addFailureListener(listener); http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/545414c1/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/jms/client/ConnectionTest.java ---------------------------------------------------------------------- diff --git a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/jms/client/ConnectionTest.java b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/jms/client/ConnectionTest.java index 7770726..8ea65db 100644 --- a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/jms/client/ConnectionTest.java +++ b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/jms/client/ConnectionTest.java @@ -100,8 +100,38 @@ public class ConnectionTest extends JMSTestBase { } catch (InvalidClientIDException expected) { // expected } + + + Session session1 = conn.createSession(); + Session session2 = conn.createSession(); + + session1.close(); + session2.close(); + } + + @Test + public void testTwoConnectionsSameIDThroughCF() throws Exception { + ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:61616?clientID=myid"); + + conn = connectionFactory.createConnection(); + try { + conn2 = connectionFactory.createConnection(); + Assert.fail("Exception expected"); + } catch (InvalidClientIDException expected) { + // expected + } + + + Session session1 = conn.createSession(); + Session session2 = conn.createSession(); + + session1.close(); + session2.close(); + } + + @Test public void testGetSetConnectionFactory() throws Exception { conn = cf.createConnection();
