From 62262805abb5efaba8f57bda2988954322d897e6 Mon Sep 17 00:00:00 2001 From: Martyn Taylor Date: Mon, 2 Nov 2015 12:10:33 +0000 Subject: [PATCH] ARTEMIS-291 Allow multiple acceptors with same host/port --- .../server/impl/RemotingServiceImpl.java | 8 -- .../unit/core/remoting/AcceptorsTest.java | 56 +++++++++++ .../server/impl/fake/FakeAcceptorFactory.java | 95 +++++++++++++++++++ 3 files changed, 151 insertions(+), 8 deletions(-) create mode 100644 tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/remoting/AcceptorsTest.java create mode 100644 tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/remoting/server/impl/fake/FakeAcceptorFactory.java diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/remoting/server/impl/RemotingServiceImpl.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/remoting/server/impl/RemotingServiceImpl.java index 06428f9d5f..42752bc0d7 100644 --- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/remoting/server/impl/RemotingServiceImpl.java +++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/remoting/server/impl/RemotingServiceImpl.java @@ -205,15 +205,7 @@ public class RemotingServiceImpl implements RemotingService, ConnectionLifeCycle threadPool = Executors.newCachedThreadPool(tFactory); - HashSet namelessAcceptors = new HashSet<>(); - for (TransportConfiguration info : acceptorsConfig) { - TransportConfiguration nameless = info.newTransportConfig(""); - if (namelessAcceptors.contains(nameless)) { - ActiveMQServerLogger.LOGGER.duplicatedAcceptor(info.getName(), "" + info.getParams(), info.getFactoryClassName()); - continue; - } - namelessAcceptors.add(nameless); try { AcceptorFactory factory = server.getServiceRegistry().getAcceptorFactory(info.getName(), info.getFactoryClassName()); diff --git a/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/remoting/AcceptorsTest.java b/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/remoting/AcceptorsTest.java new file mode 100644 index 0000000000..88f02b2660 --- /dev/null +++ b/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/remoting/AcceptorsTest.java @@ -0,0 +1,56 @@ +/* + * 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.unit.core.remoting; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +import org.apache.activemq.artemis.api.core.TransportConfiguration; +import org.apache.activemq.artemis.core.config.Configuration; +import org.apache.activemq.artemis.core.server.ActiveMQServer; +import org.apache.activemq.artemis.tests.util.ActiveMQTestBase; +import org.junit.Test; + +public class AcceptorsTest extends ActiveMQTestBase { + + @Test + public void testMultipleAcceptorsWithSameHostPortDifferentName() throws Exception + { + final String acceptorFactoryClass = "org.apache.activemq.artemis.tests.unit.core.remoting.server.impl.fake.FakeAcceptorFactory"; + + Map params = new HashMap<>(); + params.put("host", "localhost"); + params.put("port", 5445); + + Set tcs = new HashSet<>(); + tcs.add(new TransportConfiguration(acceptorFactoryClass, params, "Acceptor1")); + tcs.add(new TransportConfiguration(acceptorFactoryClass, params, "Acceptor2")); + + Configuration config = createBasicConfig(); + config.setAcceptorConfigurations(tcs); + + ActiveMQServer server = createServer(config); + + server.start(); + waitForServerToStart(server); + + assertNotNull(server.getRemotingService().getAcceptor("Acceptor1")); + assertNotNull(server.getRemotingService().getAcceptor("Acceptor2")); + } +} diff --git a/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/remoting/server/impl/fake/FakeAcceptorFactory.java b/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/remoting/server/impl/fake/FakeAcceptorFactory.java new file mode 100644 index 0000000000..3ced505e3a --- /dev/null +++ b/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/remoting/server/impl/fake/FakeAcceptorFactory.java @@ -0,0 +1,95 @@ +/* + * 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.unit.core.remoting.server.impl.fake; + +import java.util.Map; +import java.util.concurrent.Executor; +import java.util.concurrent.ScheduledExecutorService; + +import org.apache.activemq.artemis.core.security.ActiveMQPrincipal; +import org.apache.activemq.artemis.core.server.cluster.ClusterConnection; +import org.apache.activemq.artemis.core.server.management.NotificationService; +import org.apache.activemq.artemis.spi.core.protocol.ProtocolManager; +import org.apache.activemq.artemis.spi.core.remoting.Acceptor; +import org.apache.activemq.artemis.spi.core.remoting.AcceptorFactory; +import org.apache.activemq.artemis.spi.core.remoting.BufferHandler; +import org.apache.activemq.artemis.spi.core.remoting.ConnectionLifeCycleListener; + +public class FakeAcceptorFactory implements AcceptorFactory { + + private boolean started = false; + + @Override + public Acceptor createAcceptor(String name, + ClusterConnection clusterConnection, + Map configuration, + BufferHandler handler, + ConnectionLifeCycleListener listener, + Executor threadPool, + ScheduledExecutorService scheduledThreadPool, + Map protocolMap) { + return new FakeAcceptor(); + } + + private final class FakeAcceptor implements Acceptor { + + @Override + public void pause() { + + } + + @Override + public ClusterConnection getClusterConnection() { + return null; + } + + @Override + public Map getConfiguration() { + return null; + } + + @Override + public void setNotificationService(NotificationService notificationService) { + + } + + @Override + public void setDefaultActiveMQPrincipal(ActiveMQPrincipal defaultActiveMQPrincipal) { + + } + + @Override + public boolean isUnsecurable() { + return false; + } + + @Override + public void start() throws Exception { + started = true; + } + + @Override + public void stop() throws Exception { + started = false; + } + + @Override + public boolean isStarted() { + return started; + } + } +}