001/** 002 * Licensed to the Apache Software Foundation (ASF) under one or more 003 * contributor license agreements. See the NOTICE file distributed with 004 * this work for additional information regarding copyright ownership. 005 * The ASF licenses this file to You under the Apache License, Version 2.0 006 * (the "License"); you may not use this file except in compliance with 007 * the License. You may obtain a copy of the License at 008 * 009 * http://www.apache.org/licenses/LICENSE-2.0 010 * 011 * Unless required by applicable law or agreed to in writing, software 012 * distributed under the License is distributed on an "AS IS" BASIS, 013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 014 * See the License for the specific language governing permissions and 015 * limitations under the License. 016 */ 017 018package org.apache.activemq.console.command; 019 020import java.net.URI; 021import java.util.List; 022import java.util.concurrent.CountDownLatch; 023 024import org.apache.activemq.broker.BrokerFactory; 025import org.apache.activemq.broker.BrokerService; 026 027public class StartCommand extends AbstractCommand { 028 029 public static final String DEFAULT_CONFIG_URI = "xbean:activemq.xml"; 030 031 protected String[] helpFile = new String[] { 032 "Task Usage: Main start [start-options] [uri]", 033 "Description: Creates and starts a broker using a configuration file, or a broker URI.", 034 "", 035 "Start Options:", 036 " -D<name>=<value> Define a system property.", 037 " --version Display the version information.", 038 " -h,-?,--help Display the start broker help information.", 039 "", 040 "URI:", 041 "", 042 " XBean based broker configuration:", 043 "", 044 " Example: Main xbean:file:activemq.xml", 045 " Loads the xbean configuration file from the current working directory", 046 " Example: Main xbean:activemq.xml", 047 " Loads the xbean configuration file from the classpath", 048 "", 049 " URI Parameter based broker configuration:", 050 "", 051 " Example: Main broker:(tcp://localhost:61616, tcp://localhost:5000)?useJmx=true", 052 " Configures the broker with 2 transport connectors and jmx enabled", 053 " Example: Main broker:(tcp://localhost:61616, network:tcp://localhost:5000)?persistent=false", 054 " Configures the broker with 1 transport connector, and 1 network connector and persistence disabled", 055 "" 056 }; 057 058 @Override 059 public String getName() { 060 return "start"; 061 } 062 063 @Override 064 public String getOneLineDescription() { 065 return "Creates and starts a broker using a configuration file, or a broker URI."; 066 } 067 068 /** 069 * The default task to start a broker or a group of brokers 070 * 071 * @param brokerURIs 072 */ 073 protected void runTask(List<String> brokerURIs) throws Exception { 074 URI configURI; 075 076 while( true ) { 077 final BrokerService broker; 078 try { 079 // If no config uri, use default setting 080 if (brokerURIs.isEmpty()) { 081 configURI = new URI(DEFAULT_CONFIG_URI); 082 } else { 083 configURI = new URI(brokerURIs.get(0)); 084 } 085 086 System.out.println("Loading message broker from: " + configURI); 087 broker = BrokerFactory.createBroker(configURI); 088 broker.start(); 089 090 } catch (Exception e) { 091 context.printException(new RuntimeException("Failed to execute start task. Reason: " + e, e)); 092 throw e; 093 } 094 095 if (!broker.waitUntilStarted()) { 096 throw new Exception(broker.getStartException()); 097 } 098 099 // The broker started up fine. Now lets wait for it to stop... 100 final CountDownLatch shutdownLatch = new CountDownLatch(1); 101 final Thread jvmShutdownHook = new Thread() { 102 public void run() { 103 try { 104 broker.stop(); 105 } catch (Exception e) { 106 } 107 } 108 }; 109 110 Runtime.getRuntime().addShutdownHook(jvmShutdownHook); 111 broker.addShutdownHook(new Runnable() { 112 public void run() { 113 shutdownLatch.countDown(); 114 } 115 }); 116 117 // The broker has stopped.. 118 shutdownLatch.await(); 119 try { 120 Runtime.getRuntime().removeShutdownHook(jvmShutdownHook); 121 } catch (Throwable e) { 122 // may already be shutdown in progress so ignore 123 } 124 125 if( !broker.isRestartRequested() ) { 126 break; 127 } 128 System.out.println("Restarting broker"); 129 } 130 } 131 132 /** 133 * Print the help messages for the browse command 134 */ 135 protected void printHelp() { 136 context.printHelp(helpFile); 137 } 138 139}