/**
* 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.broker.artemiswrapper;
import javax.management.MBeanServer;
import javax.management.MBeanServerInvocationHandler;
import javax.management.ObjectName;
import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import org.apache.activemq.artemis.core.config.Configuration;
import org.apache.activemq.artemis.core.config.impl.ConfigurationImpl;
import org.apache.activemq.artemis.core.server.JournalType;
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.embedded.EmbeddedJMS;
import org.apache.activemq.artemis.utils.ThreadLeakCheckRule;
import org.apache.activemq.artemis.utils.uri.URISupport;
import org.apache.activemq.broker.BrokerService;
import org.junit.Assert;
import org.junit.Rule;
import org.junit.rules.TemporaryFolder;
import org.junit.rules.TestName;
public class OpenwireArtemisBaseTest {
@Rule
public CleanupThreadRule cleanupRules = new CleanupThreadRule();
@Rule
public ThreadLeakCheckRule leakCheckRule = new ThreadLeakCheckRule();
@Rule
public TemporaryFolder temporaryFolder;
@Rule
public TestName name = new TestName();
public OpenwireArtemisBaseTest() {
File tmpRoot = new File("./target/tmp");
tmpRoot.mkdirs();
temporaryFolder = new TemporaryFolder(tmpRoot);
//The wrapper stuff will automatically create a default
//server on a normal connection factory, which will
//cause problems with clustering tests, which starts
//all servers explicitly. Setting this to true
//can prevent the auto-creation from happening.
BrokerService.disableWrapper = true;
}
public String getTmp() {
return getTmpFile().getAbsolutePath();
}
public File getTmpFile() {
return temporaryFolder.getRoot();
}
protected String getJournalDir(int serverID, boolean backup) {
return getTmp() + "/journal_" + serverID + "_" + backup;
}
protected String getBindingsDir(int serverID, boolean backup) {
return getTmp() + "/binding_" + serverID + "_" + backup;
}
protected String getPageDir(int serverID, boolean backup) {
return getTmp() + "/paging_" + serverID + "_" + backup;
}
protected String getLargeMessagesDir(int serverID, boolean backup) {
return getTmp() + "/paging_" + serverID + "_" + backup;
}
public String CLUSTER_PASSWORD = "OPENWIRECLUSTER";
protected Configuration createConfig(final int serverID) throws Exception {
return createConfig("localhost", serverID, Collections.EMPTY_MAP);
}
protected Configuration createConfig(final String hostAddress, final int serverID, final int port) throws Exception {
ConfigurationImpl configuration = new ConfigurationImpl().setJMXManagementEnabled(false).
setSecurityEnabled(false).setJournalMinFiles(2).setJournalFileSize(1000 * 1024).setJournalType(JournalType.NIO).
setJournalDirectory(getJournalDir(serverID, false)).
setBindingsDirectory(getBindingsDir(serverID, false)).
setPagingDirectory(getPageDir(serverID, false)).
setLargeMessagesDirectory(getLargeMessagesDir(serverID, false)).
setJournalCompactMinFiles(0).
setJournalCompactPercentage(0).
setClusterPassword(CLUSTER_PASSWORD);
configuration.addAddressesSetting("#", new AddressSettings().setAutoCreateJmsQueues(true).setAutoDeleteJmsQueues(true));
configuration.addAcceptorConfiguration("netty", newURIwithPort(hostAddress, port));
configuration.addConnectorConfiguration("netty-connector", newURIwithPort(hostAddress, port));
return configuration;
}
protected Configuration createConfig(final String hostAddress, final int serverID) throws Exception {
return createConfig(hostAddress, serverID, Collections.EMPTY_MAP);
}
protected Configuration createConfig(final String hostAddress,
final int serverID,
Map<String, String> params) throws Exception {
ConfigurationImpl configuration = new ConfigurationImpl().setJMXManagementEnabled(false).
setSecurityEnabled(false).setJournalMinFiles(2).setJournalFileSize(1000 * 1024).setJournalType(JournalType.NIO).
setJournalDirectory(getJournalDir(serverID, false)).
setBindingsDirectory(getBindingsDir(serverID, false)).
setPagingDirectory(getPageDir(serverID, false)).
setLargeMessagesDirectory(getLargeMessagesDir(serverID, false)).
setJournalCompactMinFiles(0).
setJournalCompactPercentage(0).
setClusterPassword(CLUSTER_PASSWORD);
configuration.addAddressesSetting("#", new AddressSettings().setAutoCreateJmsQueues(true).setAutoDeleteJmsQueues(true));
configuration.addAcceptorConfiguration("netty", newURI(hostAddress, serverID) + "?" + URISupport.createQueryString(params));
configuration.addConnectorConfiguration("netty-connector", newURI(hostAddress, serverID));
return configuration;
}
//extraAcceptor takes form: "?name=value&name1=value ..."
protected Configuration createConfig(final int serverID, String extraAcceptorParams) throws Exception {
ConfigurationImpl configuration = new ConfigurationImpl().setJMXManagementEnabled(false).
setSecurityEnabled(false).setJournalMinFiles(2).setJournalFileSize(100 * 1024).setJournalType(JournalType.NIO).
setJournalDirectory(getJournalDir(serverID, false)).
setBindingsDirectory(getBindingsDir(serverID, false)).
setPagingDirectory(getPageDir(serverID, false)).
setLargeMessagesDirectory(getLargeMessagesDir(serverID, false)).
setJournalCompactMinFiles(0).
setJournalCompactPercentage(0).
setClusterPassword(CLUSTER_PASSWORD);
configuration.addAddressesSetting("#", new AddressSettings().setAutoCreateJmsQueues(true).setAutoDeleteJmsQueues(true));
String fullAcceptorUri = newURI(serverID) + extraAcceptorParams;
configuration.addAcceptorConfiguration("netty", fullAcceptorUri);
configuration.addConnectorConfiguration("netty-connector", newURI(serverID));
return configuration;
}
public void deployClusterConfiguration(Configuration config, Integer... targetIDs) throws Exception {
StringBuffer stringBuffer = new StringBuffer();
String separator = "";
for (int x : targetIDs) {
stringBuffer.append(separator + newURI(x));
separator = ",";
}
String ccURI = "static://(" + stringBuffer.toString() + ")?connectorName=netty-connector;retryInterval=500;messageLoadBalancingType=STRICT;maxHops=1";
config.addClusterConfiguration("clusterCC", ccURI);
}
protected static String newURI(int serverID) {
return newURI("localhost", serverID);
}
protected static String newURI(String localhostAddress, int serverID) {
return "tcp://" + localhostAddress + ":" + (61616 + serverID);
}
protected static String newURIwithPort(String localhostAddress, int port) throws Exception {
return newURIwithPort(localhostAddress, port, Collections.EMPTY_MAP);
}
protected static String newURIwithPort(String localhostAddress,
int port,
Map<String, String> params) throws Exception {
return "tcp://" + localhostAddress + ":" + port + "?" + URISupport.createQueryString(params);
}
private static Object createProxy(final ObjectName objectName,
final Class mbeanInterface,
final MBeanServer mbeanServer) {
return MBeanServerInvocationHandler.newProxyInstance(mbeanServer, objectName, mbeanInterface, false);
}
protected void shutDownClusterServers(EmbeddedJMS[] servers) throws Exception {
for (int i = 0; i < servers.length; i++) {
try {
servers[i].stop();
} catch (Throwable t) {
t.printStackTrace();
}
}
}
protected void shutDownNonClusterServers(EmbeddedJMS[] servers) throws Exception {
shutDownClusterServers(servers);
}
protected void setUpNonClusterServers(EmbeddedJMS[] servers) throws Exception {
Configuration[] serverCfgs = new Configuration[servers.length];
for (int i = 0; i < servers.length; i++) {
serverCfgs[i] = createConfig(i);
}
for (int i = 0; i < servers.length; i++) {
servers[i] = new EmbeddedJMS().setConfiguration(serverCfgs[i]).setJmsConfiguration(new JMSConfigurationImpl());
}
for (int i = 0; i < servers.length; i++) {
servers[i].start();
}
}
protected void setUpClusterServers(EmbeddedJMS[] servers) throws Exception {
Configuration[] serverCfgs = new Configuration[servers.length];
for (int i = 0; i < servers.length; i++) {
serverCfgs[i] = createConfig(i);
}
for (int i = 0; i < servers.length; i++) {
deployClusterConfiguration(serverCfgs[i], getTargets(servers.length, i));
}
for (int i = 0; i < servers.length; i++) {
servers[i] = new EmbeddedJMS().setConfiguration(serverCfgs[i]).setJmsConfiguration(new JMSConfigurationImpl());
}
for (int i = 0; i < servers.length; i++) {
servers[i].start();
}
for (int i = 0; i < servers.length; i++) {
Assert.assertTrue(servers[i].waitClusterForming(100, TimeUnit.MILLISECONDS, 20, servers.length));
}
}
private Integer[] getTargets(int total, int self) {
int lenTargets = total - self;
List<Integer> targets = new ArrayList<>();
for (int i = 0; i < lenTargets; i++) {
if (i != self) {
targets.add(i);
}
}
return targets.toArray(new Integer[0]);
}
public EmbeddedJMS createBroker() throws Exception {
Configuration config0 = createConfig(0);
EmbeddedJMS newbroker = new EmbeddedJMS().setConfiguration(config0).setJmsConfiguration(new JMSConfigurationImpl());
return newbroker;
}
}