You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm@geronimo.apache.org by ge...@apache.org on 2003/08/10 22:42:53 UTC
cvs commit: incubator-geronimo/modules/core/src/java/org/apache/geronimo Main.java
geirm 2003/08/10 13:42:53
Added: modules/core/src/java/org/apache/geronimo Main.java
Log:
initial import
Revision Changes Path
1.1 incubator-geronimo/modules/core/src/java/org/apache/geronimo/Main.java
Index: Main.java
===================================================================
/* ====================================================================
* The Apache Software License, Version 1.1
*
* Copyright (c) 2003 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution,
* if any, must include the following acknowledgment:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowledgment may appear in the software itself,
* if and wherever such third-party acknowledgments normally appear.
*
* 4. The names "Apache" and "Apache Software Foundation" and
* "Apache Geronimo" must not be used to endorse or promote products
* derived from this software without prior written permission. For
* written permission, please contact apache@apache.org.
*
* 5. Products derived from this software may not be called "Apache",
* "Apache Geronimo", nor may "Apache" appear in their name, without
* prior written permission of the Apache Software Foundation.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*
* ====================================================================
*/
package org.apache.geronimo;
import java.net.URL;
import java.net.MalformedURLException;
import java.util.Iterator;
import java.util.Set;
import javax.management.MBeanServer;
import javax.management.MBeanServerFactory;
import javax.management.ObjectInstance;
import javax.management.ObjectName;
import javax.management.loading.MLet;
import org.apache.log4j.Logger;
/**
*
*
*
* @version $Revision: 1.1 $ $Date: 2003/08/10 20:42:53 $
*/
public class Main implements Runnable {
private static final Logger log = Logger.getLogger("Geronimo");
private String domainName;
private URL bootURL;
private MBeanServer mbServer;
private ObjectName serverName;
private ObjectName bootMLetName;
private Set bootedMBeans;
public Main(String domainName, URL url) {
this.domainName = domainName;
bootURL = url;
}
/**
* Main entry point
*/
public void run() {
ShutdownThread hook = new ShutdownThread("Shutdown-Thread", Thread.currentThread());
try {
Runtime.getRuntime().addShutdownHook(hook);
try {
init();
} catch (Throwable e) {
log.error("Error starting Server", e);
return;
}
// and now go to sleep until exit
try {
synchronized (this) {
wait();
}
} catch (InterruptedException e) {
// time to go...
}
} finally {
try {
Runtime.getRuntime().removeShutdownHook(hook);
} catch (Exception e) {
// we were in the process of shutting down - ignore
}
shutdown();
}
}
private void init() throws Throwable {
long start = System.currentTimeMillis();
log.info("Starting MBeanServer");
mbServer = MBeanServerFactory.createMBeanServer(domainName);
bootMLet(bootURL);
serverName = findServer();
// start her up
log.info("Initializing Server " + serverName);
mbServer.invoke(serverName, "init", null, null);
log.info("Starting Server " + serverName);
mbServer.invoke(serverName, "start", null, null);
long end = System.currentTimeMillis();
log.info("Started Server in " + (end - start) + "ms.");
}
private void shutdown() {
if (serverName != null) {
try {
log.info("Stopping Server");
mbServer.invoke(serverName, "stop", null, null);
mbServer.invoke(serverName, "destroy", null, null);
} catch (Throwable e) {
log.error("Error stopping Server", e);
}
}
if (bootedMBeans != null) {
for (Iterator i = bootedMBeans.iterator(); i.hasNext();) {
Object o = i.next();
if (o instanceof ObjectInstance) {
ObjectInstance inst = (ObjectInstance) o;
ObjectName name = inst.getObjectName();
try {
log.debug("Unregistering " + name);
mbServer.unregisterMBean(name);
} catch (Throwable t) {
log.error("Error unregistering " + name);
}
}
}
}
if (bootMLetName != null) {
try {
log.info("Unregistering MLet " + bootMLetName);
mbServer.unregisterMBean(bootMLetName);
} catch (Throwable t) {
log.error("Error unregistering MLet ", t);
}
}
if (mbServer != null) {
try {
log.info("Releasing MBeanServer");
MBeanServerFactory.releaseMBeanServer(mbServer);
} catch (Throwable t) {
log.error("Error releasing MBeanServer", t);
}
}
log.info("Shutdown complete");
}
private void bootMLet(URL url) throws Throwable {
log.info("Booting from URL " + url);
MLet bootMLet = new MLet();
bootMLetName = mbServer.registerMBean(bootMLet, new ObjectName("geronimo.boot:type=BootMLet,url=\"" + url + "\"")).getObjectName();
bootedMBeans = bootMLet.getMBeansFromURL(url);
// check they all loaded OK
for (Iterator i = bootedMBeans.iterator(); i.hasNext();) {
Object o = i.next();
if (o instanceof Throwable) {
throw (Throwable) o;
}
}
}
private ObjectName findServer() throws Exception {
// find which one (and only one) is our Server
Set serverMBeans = mbServer.queryNames(new ObjectName("geronimo.server:type=Server,*"), null);
if (serverMBeans.size() == 0) {
throw new Exception("No Server found (ObjectName must match \"" + serverName + "\")");
} else if (serverMBeans.size() > 1) {
throw new Exception("Multiple Servers found (ObjectName matching \"" + serverName + "\")");
}
return (ObjectName) serverMBeans.iterator().next();
}
/**
* Command line entry point.
* Starts a new ThreadGroup so that all owned threads can be identified.
* @param args command line arguments
*/
public static void main(String[] args) {
URL url;
try {
url = new URL("file:server/default/config/boot.mlet");
} catch (MalformedURLException e) {
e.printStackTrace();
return;
}
Main main = new Main(args[0], url); // @todo you should not need to explicitly name the MBean Server
ThreadGroup group = new ThreadGroup("Geronimo");
Thread mainThread = new Thread(group, main, "Main-Thread");
mainThread.start();
}
private static class ShutdownThread extends Thread {
private final Thread mainThread;
private ShutdownThread(String name, Thread mainThread) {
super(name);
this.mainThread = mainThread;
}
public void run() {
mainThread.interrupt();
try {
mainThread.join();
} catch (InterruptedException e) {
}
}
}
}