/*
* 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.util;
import javax.jms.ConnectionFactory;
import javax.jms.Queue;
import javax.jms.Topic;
import javax.management.MBeanServer;
import javax.management.MBeanServerFactory;
import java.util.ArrayList;
import org.apache.activemq.artemis.api.core.TransportConfiguration;
import org.apache.activemq.artemis.api.jms.ActiveMQJMSClient;
import org.apache.activemq.artemis.api.jms.JMSFactoryType;
import org.apache.activemq.artemis.core.config.ClusterConnectionConfiguration;
import org.apache.activemq.artemis.core.config.Configuration;
import org.apache.activemq.artemis.core.registry.JndiBindingRegistry;
import org.apache.activemq.artemis.core.remoting.impl.invm.InVMConnectorFactory;
import org.apache.activemq.artemis.core.server.ActiveMQServer;
import org.apache.activemq.artemis.core.server.ActiveMQServers;
import org.apache.activemq.artemis.core.server.cluster.impl.MessageLoadBalancingType;
import org.apache.activemq.artemis.core.settings.impl.AddressSettings;
import org.apache.activemq.artemis.jms.server.config.impl.JMSConfigurationImpl;
import org.apache.activemq.artemis.jms.server.impl.JMSServerManagerImpl;
import org.apache.activemq.artemis.tests.integration.IntegrationTestLogger;
import org.apache.activemq.artemis.tests.unit.util.InVMNamingContext;
import org.junit.Before;
public class JMSClusteredTestBase extends ActiveMQTestBase {
private static final IntegrationTestLogger log = IntegrationTestLogger.LOGGER;
protected MBeanServer mBeanServer1;
protected ActiveMQServer server1;
protected JMSServerManagerImpl jmsServer1;
protected MBeanServer mBeanServer2;
protected ActiveMQServer server2;
protected JMSServerManagerImpl jmsServer2;
protected ConnectionFactory cf1;
protected ConnectionFactory cf2;
protected InVMNamingContext context1;
protected InVMNamingContext context2;
protected static final int MAX_HOPS = 1;
// Static --------------------------------------------------------
// Attributes ----------------------------------------------------
// Constructors --------------------------------------------------
// TestCase overrides -------------------------------------------
// Public --------------------------------------------------------
// Package protected ---------------------------------------------
// Protected -----------------------------------------------------
/**
* @throws Exception
*/
protected Queue createQueue(final String name) throws Exception {
jmsServer2.createQueue(false, name, null, true, "/queue/" + name);
jmsServer1.createQueue(false, name, null, true, "/queue/" + name);
assertTrue(waitForBindings(server1, name, false, 1, 0, 10000));
assertTrue(waitForBindings(server2, name, false, 1, 0, 10000));
return (Queue) context1.lookup("/queue/" + name);
}
protected Topic createTopic(final String name) throws Exception {
return createTopic(name, false);
}
protected Topic createTopic(final String name, boolean durable) throws Exception {
jmsServer2.createTopic(durable, name, "/topic/" + name);
jmsServer1.createTopic(durable, name, "/topic/" + name);
return (Topic) context1.lookup("/topic/" + name);
}
@Override
@Before
public void setUp() throws Exception {
super.setUp();
setupServer2();
setupServer1();
jmsServer1.start();
jmsServer1.activated();
waitForServerToStart(jmsServer1.getActiveMQServer());
jmsServer2.start();
jmsServer2.activated();
waitForServerToStart(jmsServer2.getActiveMQServer());
waitForTopology(jmsServer1.getActiveMQServer(), 2);
waitForTopology(jmsServer2.getActiveMQServer(), 2);
cf1 = ActiveMQJMSClient.createConnectionFactoryWithoutHA(JMSFactoryType.CF, new TransportConfiguration(InVMConnectorFactory.class.getName(), generateInVMParams(1)));
cf2 = ActiveMQJMSClient.createConnectionFactoryWithoutHA(JMSFactoryType.CF, new TransportConfiguration(InVMConnectorFactory.class.getName(), generateInVMParams(2)));
}
/**
* @throws Exception
*/
private void setupServer2() throws Exception {
Configuration configuration = createConfigServer(2, 1);
JMSConfigurationImpl jmsconfig = new JMSConfigurationImpl();
mBeanServer2 = MBeanServerFactory.createMBeanServer();
server2 = addServer(ActiveMQServers.newActiveMQServer(configuration, mBeanServer2, enablePersistence()));
jmsServer2 = new JMSServerManagerImpl(server2, jmsconfig);
context2 = new InVMNamingContext();
jmsServer2.setRegistry(new JndiBindingRegistry(context2));
}
/**
* @throws Exception
*/
private void setupServer1() throws Exception {
Configuration configuration = createConfigServer(1, 2);
JMSConfigurationImpl jmsconfig = new JMSConfigurationImpl();
mBeanServer1 = MBeanServerFactory.createMBeanServer();
server1 = addServer(ActiveMQServers.newActiveMQServer(configuration, mBeanServer1, enablePersistence()));
jmsServer1 = new JMSServerManagerImpl(server1, jmsconfig);
context1 = new InVMNamingContext();
jmsServer1.setRegistry(new JndiBindingRegistry(context1));
}
protected boolean enablePersistence() {
return false;
}
/**
* @return
*/
protected Configuration createConfigServer(final int source, final int destination) throws Exception {
final String destinationLabel = "toServer" + destination;
final String sourceLabel = "server" + source;
Configuration configuration = createDefaultInVMConfig(source).setSecurityEnabled(false)
.setJMXManagementEnabled(true)
.setPersistenceEnabled(false)
.addConnectorConfiguration(destinationLabel, new TransportConfiguration(InVMConnectorFactory.class.getName(), generateInVMParams(destination)))
.addConnectorConfiguration(sourceLabel, new TransportConfiguration(InVMConnectorFactory.class.getName(), generateInVMParams(source)))
.addClusterConfiguration(new ClusterConnectionConfiguration().setName(destinationLabel)
.setConnectorName(sourceLabel)
.setRetryInterval(250)
.setMaxHops(MAX_HOPS)
.setConfirmationWindowSize(1024)
.setMessageLoadBalancingType(MessageLoadBalancingType.ON_DEMAND)
.setStaticConnectors(new ArrayList<String>() {
{
add(destinationLabel);
}
}));
configuration.getAddressesSettings().put("#", new AddressSettings().setRedistributionDelay(0));
return configuration;
}
// Private -------------------------------------------------------
// Inner classes -------------------------------------------------
}