You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@activemq.apache.org by js...@apache.org on 2006/01/04 15:42:30 UTC

svn commit: r365917 - in /incubator/activemq/trunk/activemq-core/src: main/java/org/apache/activemq/broker/ main/java/org/apache/activemq/broker/region/ test/java/org/apache/activemq/

Author: jstrachan
Date: Wed Jan  4 06:42:24 2006
New Revision: 365917

URL: http://svn.apache.org/viewcvs?rev=365917&view=rev
Log:
added test case and fix for AMQ-463 to test for duplicate clientIDs connecting

Added:
    incubator/activemq/trunk/activemq-core/src/test/java/org/apache/activemq/ReconnectWithSameClientIDTest.java   (with props)
Modified:
    incubator/activemq/trunk/activemq-core/src/main/java/org/apache/activemq/broker/AbstractConnection.java
    incubator/activemq/trunk/activemq-core/src/main/java/org/apache/activemq/broker/region/RegionBroker.java

Modified: incubator/activemq/trunk/activemq-core/src/main/java/org/apache/activemq/broker/AbstractConnection.java
URL: http://svn.apache.org/viewcvs/incubator/activemq/trunk/activemq-core/src/main/java/org/apache/activemq/broker/AbstractConnection.java?rev=365917&r1=365916&r2=365917&view=diff
==============================================================================
--- incubator/activemq/trunk/activemq-core/src/main/java/org/apache/activemq/broker/AbstractConnection.java (original)
+++ incubator/activemq/trunk/activemq-core/src/main/java/org/apache/activemq/broker/AbstractConnection.java Wed Jan  4 06:42:24 2006
@@ -20,7 +20,7 @@
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Iterator;
-import java.util.LinkedList;
+import java.util.*;
 import java.util.List;
 
 import org.apache.activemq.Service;
@@ -61,6 +61,8 @@
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
+import javax.jms.InvalidClientIDException;
+
 import edu.emory.mathcs.backport.java.util.concurrent.ConcurrentHashMap;
 
 
@@ -447,12 +449,12 @@
     
     public Response processAddConnection(ConnectionInfo info) throws Throwable {
         // Setup the context.
+        String clientId = info.getClientId();
         ConnectionContext context = new ConnectionContext();
         context.setConnection(this);
         context.setBroker(broker);
         context.setConnector(connector);
         context.setTransactions(new ConcurrentHashMap());
-        String clientId = info.getClientId();
         context.setClientId(clientId);
         context.setUserName(info.getUserName());
         context.setConnectionId(info.getConnectionId());

Modified: incubator/activemq/trunk/activemq-core/src/main/java/org/apache/activemq/broker/region/RegionBroker.java
URL: http://svn.apache.org/viewcvs/incubator/activemq/trunk/activemq-core/src/main/java/org/apache/activemq/broker/region/RegionBroker.java?rev=365917&r1=365916&r2=365917&view=diff
==============================================================================
--- incubator/activemq/trunk/activemq-core/src/main/java/org/apache/activemq/broker/region/RegionBroker.java (original)
+++ incubator/activemq/trunk/activemq-core/src/main/java/org/apache/activemq/broker/region/RegionBroker.java Wed Jan  4 06:42:24 2006
@@ -40,10 +40,13 @@
 import org.apache.activemq.util.IdGenerator;
 import org.apache.activemq.util.LongSequenceGenerator;
 
+import javax.jms.InvalidClientIDException;
 import javax.jms.JMSException;
 
 import java.io.IOException;
 import java.util.ArrayList;
+import java.util.*;
+import java.util.Set;
 
 /**
  * Routes Broker operations to the correct messaging regions for processing.
@@ -67,6 +70,7 @@
     private final LongSequenceGenerator sequenceGenerator = new LongSequenceGenerator();    
     private BrokerId brokerId;
     private String brokerName;
+    private Map clientIdSet = new HashMap(); // we will synchronize access
 
     public RegionBroker(TaskRunnerFactory taskRunnerFactory, UsageManager memoryManager, PersistenceAdapter adapter) throws IOException {
         this(taskRunnerFactory, memoryManager, createDefaultPersistenceAdapter(memoryManager), null);
@@ -110,10 +114,35 @@
     }
 
     public void addConnection(ConnectionContext context, ConnectionInfo info) throws Throwable {
+        String clientId = info.getClientId();
+        if (clientId == null) {
+            throw new InvalidClientIDException("No clientID specified for connection request");
+        }
+        synchronized (clientIdSet ) {
+            if (clientIdSet.containsKey(clientId)) {
+                throw new InvalidClientIDException("Client: " + clientId + " already connected");
+            }
+            else {
+                clientIdSet.put(clientId, info);
+            }
+        }
+
         connections.add(context.getConnection());
     }
 
     public void removeConnection(ConnectionContext context, ConnectionInfo info, Throwable error) throws Throwable {
+        String clientId = info.getClientId();
+        if (clientId == null) {
+            throw new InvalidClientIDException("No clientID specified for connection disconnect request");
+        }
+        synchronized (clientIdSet) {
+            ConnectionInfo oldValue = (ConnectionInfo) clientIdSet.get(clientId);
+            // we may be removing the duplicate connection, not the first connection to be created
+            if (oldValue == info) {
+                clientIdSet.remove(clientId);
+            }
+        }
+
         connections.remove(context.getConnection());
     }
 

Added: incubator/activemq/trunk/activemq-core/src/test/java/org/apache/activemq/ReconnectWithSameClientIDTest.java
URL: http://svn.apache.org/viewcvs/incubator/activemq/trunk/activemq-core/src/test/java/org/apache/activemq/ReconnectWithSameClientIDTest.java?rev=365917&view=auto
==============================================================================
--- incubator/activemq/trunk/activemq-core/src/test/java/org/apache/activemq/ReconnectWithSameClientIDTest.java (added)
+++ incubator/activemq/trunk/activemq-core/src/test/java/org/apache/activemq/ReconnectWithSameClientIDTest.java Wed Jan  4 06:42:24 2006
@@ -0,0 +1,79 @@
+/**
+ * 
+ * Copyright 2005 LogicBlaze, Inc. http://www.logicblaze.com
+ * 
+ * Licensed 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;
+
+import javax.jms.Connection;
+import javax.jms.InvalidClientIDException;
+import javax.jms.JMSException;
+import javax.jms.Session;
+
+/**
+ * 
+ * @version $Revision$
+ */
+public class ReconnectWithSameClientIDTest extends EmbeddedBrokerTestSupport {
+
+    protected Connection connection;
+    protected boolean transacted;
+    protected int authMode = Session.AUTO_ACKNOWLEDGE;
+
+    public void testReconnectMultipleTimesWithSameClientID() throws Exception {
+        connection = connectionFactory.createConnection();
+        useConnection(connection);
+
+        // now lets create another which should fail
+        for (int i = 1; i < 11; i++) {
+        Connection connection2 = connectionFactory.createConnection();
+        try {
+            useConnection(connection2);
+            fail("Should have thrown InvalidClientIDException on attempt" + i);
+        }
+        catch (InvalidClientIDException e) {
+            connection2.close();
+            System.out.println("Caught expected: " + e);
+        }
+        }
+
+        // now lets try closing the original connection and creating a new connection with the same ID
+        connection.close();
+        connection = connectionFactory.createConnection();
+        useConnection(connection);
+    }
+
+    protected void setUp() throws Exception {
+        bindAddress = "tcp://localhost:61616";
+        super.setUp();
+    }
+
+    protected void tearDown() throws Exception {
+        if (connection != null) {
+            connection.close();
+            connection = null;
+        }
+        super.tearDown();
+    }
+
+    protected void useConnection(Connection connection) throws JMSException {
+        connection.setClientID("foo");
+        connection.start();
+        /**
+         * Session session = connection.createSession(transacted, authMode);
+         * return session;
+         */
+    }
+}

Propchange: incubator/activemq/trunk/activemq-core/src/test/java/org/apache/activemq/ReconnectWithSameClientIDTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/activemq/trunk/activemq-core/src/test/java/org/apache/activemq/ReconnectWithSameClientIDTest.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: incubator/activemq/trunk/activemq-core/src/test/java/org/apache/activemq/ReconnectWithSameClientIDTest.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain