/* * 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.jms.tests.tools; import java.util.ArrayList; import java.util.Hashtable; import java.util.List; import org.apache.activemq.artemis.jms.tests.JmsTestLogger; import org.apache.activemq.artemis.jms.tests.tools.container.InVMInitialContextFactory; import org.apache.activemq.artemis.jms.tests.tools.container.LocalTestServer; import org.apache.activemq.artemis.jms.tests.tools.container.Server; /** * Collection of static methods to use to start/stop and interact with the in-memory JMS server. It * is also use to start/stop a remote server. */ public class ServerManagement { // Constants ----------------------------------------------------- // logging levels used by the remote client to forward log output on a remote server public static int FATAL = 0; public static int ERROR = 1; public static int WARN = 2; public static int INFO = 3; public static int DEBUG = 4; public static int TRACE = 5; public static final String DEFAULT_QUEUE_CONTEXT = "/queue"; public static final String DEFAULT_TOPIC_CONTEXT = "/topic"; // Static -------------------------------------------------------- private static JmsTestLogger log = JmsTestLogger.LOGGER; private static List<Server> servers = new ArrayList<>(); /** * Makes sure that a "hollow" TestServer (either local or remote, depending on the nature of the * test), exists and it's ready to be started. */ public static synchronized Server create() throws Exception { return new LocalTestServer(); } public static void start(final int i, final String config, final boolean clearDatabase) throws Exception { ServerManagement.start(i, config, clearDatabase, true); } /** * When this method correctly completes, the server (local or remote) is started and fully * operational (the server container and the server peer are created and started). */ public static void start(final int i, final String config, final boolean clearDatabase, final boolean startActiveMQServer) throws Exception { throw new IllegalStateException("Method to start a server is not implemented"); } public static synchronized void kill(final int i) throws Exception { if (i == 0) { // Cannot kill server 0 if there are any other servers since it has the rmi registry in it for (int j = 1; j < ServerManagement.servers.size(); j++) { if (ServerManagement.servers.get(j) != null) { throw new IllegalStateException("Cannot kill server 0, since server[" + j + "] still exists"); } } } if (i > ServerManagement.servers.size()) { ServerManagement.log.error("server " + i + " has not been created or has already been killed, so it cannot be killed"); } else { Server server = ServerManagement.servers.get(i); ServerManagement.log.info("invoking kill() on server " + i); try { server.kill(); } catch (Throwable t) { // This is likely to throw an exception since the server dies before the response is received } ServerManagement.log.info("Waiting for server to die"); try { while (true) { server.ping(); ServerManagement.log.debug("server " + i + " still alive ..."); Thread.sleep(100); } } catch (Throwable e) { // Ok } Thread.sleep(300); ServerManagement.log.info("server " + i + " killed and dead"); } } public static Hashtable<String, String> getJNDIEnvironment(final int serverIndex) { return InVMInitialContextFactory.getJNDIEnvironment(serverIndex); } }