package org.red5.server; import java.lang.reflect.UndeclaredThrowableException; import java.util.HashMap; import javax.management.MBeanServerConnection; import javax.management.MBeanServerInvocationHandler; import javax.management.ObjectName; import javax.management.remote.JMXConnector; import javax.management.remote.JMXConnectorFactory; import javax.management.remote.JMXServiceURL; /* * RED5 Open Source Flash Server - http://www.osflash.org/red5 * * Copyright (c) 2006-2009 by respective authors (see below). All rights reserved. * * This library is free software; you can redistribute it and/or modify it under the * terms of the GNU Lesser General Public License as published by the Free Software * Foundation; either version 2.1 of the License, or (at your option) any later * version. * * This library is distributed in the hope that it will be useful, but WITHOUT ANY * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License along * with this library; if not, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /** * Provides a means to cleanly shutdown an instance from the command line. * * @author The Red5 Project (red5@osflash.org) * @author Paul Gregoire (mondain@gmail.com) */ public class Shutdown { /** * Connects to the given RMI port (default: 9999) and invokes shutdown on * the loader. * * @param args The first parameter should be a port number */ public static void main(String[] args) { try { String policyFile = System.getProperty("java.security.policy"); if (policyFile == null) { System.setProperty("java.security.debug", "failure"); System.setProperty("java.security.policy", "conf/red5.policy"); } /* try { // Enable the security manager SecurityManager sm = new SecurityManager(); System.setSecurityManager(sm); } catch (SecurityException se) { System.err.println("Security manager already set"); } */ JMXServiceURL url = null; JMXConnector jmxc = null; HashMap<String, Object> env = null; if (null == args || args.length < 1) { System.out.println("Attempting to connect to RMI port: 9999"); url = new JMXServiceURL( "service:jmx:rmi:///jndi/rmi://:9999/red5"); } else { System.out.println("Attempting to connect to RMI port: " + args[0]); url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://:" + args[0] + "/red5"); if (args.length > 1) { env = new HashMap<String, Object>(1); String[] credentials = new String[] {args[1], args[2]}; env.put("jmx.remote.credentials", credentials); } } jmxc = JMXConnectorFactory.connect(url, env); MBeanServerConnection mbs = jmxc.getMBeanServerConnection(); //check for loader registration ObjectName tomcatObjectName = new ObjectName( "org.red5.server:type=TomcatLoader"); ObjectName jettyObjectName = new ObjectName( "org.red5.server:type=JettyLoader"); LoaderMBean mbeanProxy = null; if (mbs.isRegistered(jettyObjectName)) { mbeanProxy = (LoaderMBean) MBeanServerInvocationHandler.newProxyInstance(mbs, jettyObjectName, LoaderMBean.class, true); System.out.println("Red5 Jetty loader was found"); } else if (mbs.isRegistered(tomcatObjectName)) { mbeanProxy = (LoaderMBean) MBeanServerInvocationHandler.newProxyInstance(mbs, tomcatObjectName, LoaderMBean.class, true); System.out.println("Red5 Tomcat loader was found"); } else { System.out .println("Red5 Loader was not found, is the server running?"); } if (null != mbeanProxy) { System.out.println("Calling shutdown"); mbeanProxy.shutdown(); } jmxc.close(); } catch (UndeclaredThrowableException e) { //ignore } catch (NullPointerException e) { //ignore } catch (Exception e) { e.printStackTrace(); } } }