[Jboss-cvs] JBossAS SVN: r55201 - in branches/MC_VDF_WORK: system/src/main/org/jboss/system/server system-jmx/src/main/org/jboss/system/server

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Fri Aug 4 12:26:02 EDT 2006


Author: scott.stark at jboss.org
Date: 2006-08-04 12:25:55 -0400 (Fri, 04 Aug 2006)
New Revision: 55201

Added:
   branches/MC_VDF_WORK/system-jmx/src/main/org/jboss/system/server/ServerImpl.java
Removed:
   branches/MC_VDF_WORK/system/src/main/org/jboss/system/server/ServerImpl.java
Log:
Move jmx related code to the system-jmx module

Deleted: branches/MC_VDF_WORK/system/src/main/org/jboss/system/server/ServerImpl.java
===================================================================
--- branches/MC_VDF_WORK/system/src/main/org/jboss/system/server/ServerImpl.java	2006-08-04 16:09:48 UTC (rev 55200)
+++ branches/MC_VDF_WORK/system/src/main/org/jboss/system/server/ServerImpl.java	2006-08-04 16:25:55 UTC (rev 55201)
@@ -1,1113 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- * Copyright 2005, JBoss Inc., and individual contributors as indicated
- * by the @authors tag. See the copyright.txt in the distribution for a
- * full listing of individual contributors.
- *
- * This 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 software 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 software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-package org.jboss.system.server;
-
-import java.io.File;
-import java.lang.reflect.Method;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Properties;
-import java.util.logging.LogManager;
-
-import javax.management.Attribute;
-import javax.management.ListenerNotFoundException;
-import javax.management.MBeanNotificationInfo;
-import javax.management.MBeanServer;
-import javax.management.MBeanServerFactory;
-import javax.management.Notification;
-import javax.management.NotificationEmitter;
-import javax.management.NotificationFilter;
-import javax.management.NotificationListener;
-import javax.management.ObjectInstance;
-import javax.management.ObjectName;
-
-import org.jboss.Version;
-import org.jboss.deployment.IncompleteDeploymentException;
-import org.jboss.deployment.MainDeployerMBean;
-import org.jboss.logging.JBossJDKLogManager;
-import org.jboss.logging.Logger;
-import org.jboss.mx.loading.RepositoryClassLoader;
-import org.jboss.mx.server.ServerConstants;
-import org.jboss.mx.util.JBossNotificationBroadcasterSupport;
-import org.jboss.mx.util.JMXExceptionDecoder;
-import org.jboss.mx.util.MBeanProxyExt;
-import org.jboss.mx.util.MBeanServerLocator;
-import org.jboss.mx.util.ObjectNameFactory;
-import org.jboss.net.protocol.URLStreamHandlerFactory;
-import org.jboss.system.ServiceControllerMBean;
-import org.jboss.system.server.jmx.LazyMBeanServer;
-import org.jboss.util.StopWatch;
-import org.jboss.util.file.FileSuffixFilter;
-import org.jboss.util.file.Files;
-
-/**
- * The main container component of a JBoss server instance.
- *
- * <h3>Concurrency</h3>
- * This class is <b>not</b> thread-safe.
- *
- * @jmx:mbean name="jboss.system:type=Server"
- *
- * @author <a href="mailto:marc.fleury at jboss.org">Marc Fleury</a>
- * @author <a href="mailto:jason at planet57.com">Jason Dillon</a>
- * @author <a href="mailto:scott.stark at jboss.org">Scott Stark</a>
- * @author <a href="mailto:dimitris at jboss.org">Dimitris Andreadis</a>
- * @version $Revision$
- */
-public class ServerImpl
-   implements Server, ServerImplMBean, NotificationEmitter
-{
-   private final static ObjectName DEFAULT_LOADER_NAME =
-      ObjectNameFactory.create(ServerConstants.DEFAULT_LOADER_NAME);
-
-   /** Instance logger. */
-   private Logger log;
-
-   /** Container for version information. */
-   private final Version version = Version.getInstance();
-
-   /** Package information for org.jboss */
-   private final Package jbossPackage = Package.getPackage("org.jboss");
-
-   /** The basic configuration for the server. */
-   private ServerConfigImpl config;
-
-   /** The JMX MBeanServer which will serve as our communication bus. */
-   private MBeanServer server;
-
-   /** When the server was started. */
-   private Date startDate;
-
-   /** Flag to indicate if we are started. */
-   private boolean started;
-
-   /** The JVM shutdown hook */
-   private ShutdownHook shutdownHook;
-
-   /** The JBoss Life Thread */
-   private LifeThread lifeThread;
-
-   /** The NotificationBroadcaster implementation delegate */
-   private JBossNotificationBroadcasterSupport broadcasterSupport;
-   
-   /** The bootstrap UCL class loader ObjectName */
-   private ObjectName bootstrapUCLName;
-   /** A flag indicating if shutdown has been called */
-   private boolean isInShutdown;
-
-   /**
-    * No-arg constructor for {@link ServerLoader}.
-    */
-   public ServerImpl()
-   {
-   }
-
-   /**
-    * Initialize the Server instance.
-    *
-    * @param props     The configuration properties for the server.
-    *
-    * @throws IllegalStateException    Already initialized.
-    * @throws Exception                Failed to initialize.
-    */
-   public void init(final Properties props) throws IllegalStateException, Exception
-   {
-      if (props == null)
-         throw new IllegalArgumentException("props is null");
-      if (config != null)
-         throw new IllegalStateException("already initialized");
-
-      ClassLoader oldCL = Thread.currentThread().getContextClassLoader();
-
-      try
-      {
-         Thread.currentThread().setContextClassLoader(getClass().getClassLoader());
-         doInit(props);
-      }
-      finally
-      {
-         Thread.currentThread().setContextClassLoader(oldCL);
-      }
-   }
-
-   /** Actually does the init'ing... */
-   private void doInit(final Properties props) throws Exception
-   {
-      // Create a new config object from the give properties
-      this.config = new ServerConfigImpl(props);
-
-      /* Initialize the logging layer using the Server.class. The server log
-      directory is initialized prior to this to ensure the jboss.server.log.dir
-      system property is set in case its used by the logging configs.
-      */
-      config.getServerLogDir();
-      log = Logger.getLogger(Server.class);
-
-      // Create the NotificationBroadcaster delegate
-      broadcasterSupport = new JBossNotificationBroadcasterSupport();
-      
-      // Set the VM temp directory to the server tmp dir
-      boolean overrideTmpDir = Boolean.getBoolean("jboss.server.temp.dir.overrideJavaTmpDir");
-      if( overrideTmpDir )
-      {
-         File serverTmpDir = config.getServerTempDir();
-         System.setProperty("java.io.tmpdir", serverTmpDir.getCanonicalPath());
-      }
-
-      // Setup URL handlers - do this before initializing the ServerConfig
-      initURLHandlers();
-      config.initURLs();
-
-      log.info("Starting JBoss (MX MicroKernel)...");
-
-      if (jbossPackage != null)
-      {
-         // Show what release this is...
-         log.info("Release ID: " +
-                  jbossPackage.getImplementationTitle() + " " +
-                  jbossPackage.getImplementationVersion());
-      }
-      else
-      {
-         log.warn("could not get package info to display release, either the " +
-            "jar manifest in jboss-system.jar has been mangled or you're " +
-            "running unit tests from ant outside of JBoss itself.");
-      }
-
-      log.debug("Using config: " + config);
-
-      // make sure our impl type is exposed
-      log.debug("Server type: " + getClass());
-
-      // log the boot classloader
-      ClassLoader cl = getClass().getClassLoader();
-      log.debug("Server loaded through: " + cl.getClass().getName());
-      
-      // log the boot URLs
-      if (cl instanceof NoAnnotationURLClassLoader)
-      {
-         NoAnnotationURLClassLoader nacl = (NoAnnotationURLClassLoader)cl;
-         URL[] bootURLs = nacl.getAllURLs();
-         log.debug("Boot URLs:");
-         for (int i = 0; i < bootURLs.length; i++)
-         {
-            log.debug("  " + bootURLs[i]);
-         }
-      }
-      
-      // Log the basic configuration elements
-      log.info("Home Dir: " + config.getHomeDir());
-      log.info("Home URL: " + config.getHomeURL());
-      log.debug("Library URL: " + config.getLibraryURL());
-      log.info("Patch URL: " + config.getPatchURL());
-      log.info("Server Name: " + config.getServerName());
-      log.info("Server Home Dir: " + config.getServerHomeDir());
-      log.info("Server Home URL: " + config.getServerHomeURL());
-      log.debug("Server Data Dir: " + config.getServerDataDir());
-      log.info("Server Temp Dir: " + config.getServerTempDir());
-      log.debug("Server Config URL: " + config.getServerConfigURL());
-      log.debug("Server Library URL: " + config.getServerLibraryURL());
-      log.info("Root Deployment Filename: " + config.getRootDeploymentFilename());
-   }
-
-   /**
-    * The <code>initURLHandlers</code> method calls
-    * internalInitURLHandlers.  if requireJBossURLStreamHandlers is
-    * false, any exceptions are logged and ignored.
-    *
-    */
-   private void initURLHandlers()
-   {
-      if (config.getRequireJBossURLStreamHandlerFactory())
-      {
-         internalInitURLHandlers();
-      } // end of if ()
-      else
-      {
-         try
-         {
-            internalInitURLHandlers();
-         }
-         catch (SecurityException e)
-         {
-            log.warn("You do not have permissions to set URLStreamHandlerFactory", e);
-         } // end of try-catch
-         catch (Error e)
-         {
-            log.warn("URLStreamHandlerFactory already set", e);
-         } // end of catch
-      } // end of else
-   }
-
-   /**
-    * Set up our only URLStreamHandlerFactory.
-    * This is needed to ensure Sun's version is not used (as it leaves files
-    * locked on Win2K/WinXP platforms.
-    */
-   private void internalInitURLHandlers()
-   {
-      try
-      {
-         // Install a URLStreamHandlerFactory that uses the TCL
-         URL.setURLStreamHandlerFactory(new URLStreamHandlerFactory());
-   
-         // Preload JBoss URL handlers
-         URLStreamHandlerFactory.preload();
-      }
-      catch (Error error)
-      { //very naughty but we HAVE to do this or
-         //we'll fail if we ever try to do this again
-         log.warn("Caught Throwable Error, this probably means " +
-            "we've already set the URLStreamHAndlerFactory before"); 
-         //Sys.out because we don't have logging yet
-      }
-
-      // Include the default JBoss protocol handler package
-      String handlerPkgs = System.getProperty("java.protocol.handler.pkgs");
-      if (handlerPkgs != null)
-      {
-         handlerPkgs += "|org.jboss.net.protocol";
-      }
-      else
-      {
-         handlerPkgs = "org.jboss.net.protocol";
-      }
-      System.setProperty("java.protocol.handler.pkgs", handlerPkgs);
-   }
-
-   /**
-    * Get the typed server configuration object which the
-    * server has been initalized to use.
-    *
-    * @return          Typed server configuration object.
-    *
-    * @throws IllegalStateException    Not initialized.
-    */
-   public ServerConfig getConfig() throws IllegalStateException
-   {
-      if (config == null)
-         throw new IllegalStateException("not initialized");
-
-      return config;
-   }
-
-   /**
-    * Check if the server is started.
-    *
-    * @return   True if the server is started, else false.
-    * @jmx:managed-attribute
-    */
-   public boolean isStarted()
-   {
-      return started;
-   }
-
-   /**
-    Check if the shutdown operation has been called/is in progress.
-
-    @return true if shutdown has been called, false otherwise
-    */
-   public boolean isInShutdown()
-   {
-      return isInShutdown;
-   }
-
-   /**
-    * Start the Server instance.
-    *
-    * @throws IllegalStateException    Already started or not initialized.
-    * @throws Exception                Failed to start.
-    */
-   public void start() throws IllegalStateException, Exception
-   {
-      // make sure we are initialized
-      getConfig();
-
-      // make sure we aren't started yet
-      if (started)
-         throw new IllegalStateException("already started");
-
-      ClassLoader oldCL = Thread.currentThread().getContextClassLoader();
-
-      try
-      {
-         Thread.currentThread().setContextClassLoader(getClass().getClassLoader());
-
-         // Deal with those pesky JMX throwables
-         try
-         {
-            doStart();
-         }
-         catch (Exception e)
-         {
-            JMXExceptionDecoder.rethrow(e);
-         }
-      }
-      catch (Throwable t)
-      {
-         log.debug("Failed to start", t);
-
-         if (t instanceof Exception)
-            throw (Exception)t;
-         if (t instanceof Error)
-            throw (Error)t;
-
-         throw new org.jboss.util.UnexpectedThrowable(t);
-      }
-      finally
-      {
-         Thread.currentThread().setContextClassLoader(oldCL);
-      }
-   }
-
-   /** Actually does the starting... */
-   private void doStart() throws Exception
-   {
-      // See how long it takes us to start up
-      StopWatch watch = new StopWatch(true);
-
-      // remeber when we we started
-      startDate = new Date();
-
-      log.debug("Starting General Purpose Architecture (GPA)...");
-
-      // Create the MBeanServer
-      String builder = System.getProperty(ServerConstants.MBEAN_SERVER_BUILDER_CLASS_PROPERTY,
-                                          ServerConstants.DEFAULT_MBEAN_SERVER_BUILDER_CLASS);
-      System.setProperty(ServerConstants.MBEAN_SERVER_BUILDER_CLASS_PROPERTY, builder);
-      
-      // Check if we'll use the platform MBeanServer or instantiate our own
-      if (config.getPlatformMBeanServer() == true)
-      {
-         // jdk1.5+
-         ClassLoader cl = Thread.currentThread().getContextClassLoader();
-         Class clazz = cl.loadClass("java.lang.management.ManagementFactory");
-         Method method = clazz.getMethod("getPlatformMBeanServer", null);
-         server = (MBeanServer)method.invoke(null, null);
-         // Tell the MBeanServerLocator to point to this server
-         MBeanServerLocator.setJBoss(server);
-         /* If the LazyMBeanServer was used, we need to reset to the jboss
-         MBeanServer to use our implementation for the jboss services.
-         */
-         server = LazyMBeanServer.resetToJBossServer(server);
-      }
-      else
-      {
-         // Create our own MBeanServer
-         server = MBeanServerFactory.createMBeanServer("jboss");
-      }
-      log.debug("Created MBeanServer: " + server);      
-
-      // Register server components
-      server.registerMBean(this, ServerImplMBean.OBJECT_NAME);
-      server.registerMBean(config, ServerConfigImplMBean.OBJECT_NAME);
-
-      // Initialize spine boot libraries
-      RepositoryClassLoader ucl = initBootLibraries();
-      bootstrapUCLName = ucl.getObjectName();
-      server.registerMBean(ucl, bootstrapUCLName);
-
-      // Set ServiceClassLoader as classloader for the construction of
-      // the basic system
-      Thread.currentThread().setContextClassLoader(ucl);
-
-      // General Purpose Architecture information
-      createMBean("org.jboss.system.server.ServerInfo",
-         "jboss.system:type=ServerInfo");
-
-      // Service Controller
-      ObjectName controller = createMBean("org.jboss.system.ServiceController",
-         "jboss.system:service=ServiceController");
-
-      // Main Deployer
-      ObjectName mainDeployer = startBootService(controller,
-         "org.jboss.deployment.MainDeployer", "jboss.system:service=MainDeployer");
-      server.setAttribute(mainDeployer,
-                          new Attribute("ServiceController", controller));
-
-      // Install the shutdown hook
-      shutdownHook = new ShutdownHook(controller, mainDeployer);
-      shutdownHook.setDaemon(true);
-
-      try
-      {
-         Runtime.getRuntime().addShutdownHook(shutdownHook);
-         log.debug("Shutdown hook added");
-      }
-      catch (Exception e)
-      {
-         log.warn("Failed to add shutdown hook; ignoring", e);
-      }
-
-      // JARDeployer, required to process <classpath>
-      startBootService(controller, "org.jboss.deployment.JARDeployer",
-         "jboss.system:service=JARDeployer");
-
-      // SARDeployer, required to process *-service.xml
-      startBootService(controller, "org.jboss.deployment.SARDeployer",
-         "jboss.system:service=ServiceDeployer");
-
-      log.info("Core system initialized");
-
-      // Ok, now deploy the root deployable to finish the job
-
-      MainDeployerMBean md = (MainDeployerMBean)
-         MBeanProxyExt.create(MainDeployerMBean.class, mainDeployer, server);
-
-      try
-      {
-         md.deploy(config.getServerConfigURL() + config.getRootDeploymentFilename());
-      }
-      catch (IncompleteDeploymentException e)
-      {
-         log.error("Root deployment has missing dependencies; continuing", e);
-      }
-
-      lifeThread = new LifeThread();
-      lifeThread.start();
-
-      started = true;
-      
-      // Send a notification that the startup is complete
-      Notification msg = new Notification(START_NOTIFICATION_TYPE, this, 1);
-      msg.setUserData(new Long(watch.getLapTime()));
-      sendNotification(msg); 
-      
-      watch.stop();
-
-      if (jbossPackage != null)
-      {
-         // Tell the world how fast it was =)
-         log.info("JBoss (MX MicroKernel) [" + jbossPackage.getImplementationVersion() +
-                  "] Started in " + watch);
-      }
-      else
-      {
-         log.warn("could not get package info to display release, either the " +
-            "jar manifest in jboss-boot.jar has been mangled or you're " +
-            "running unit tests from ant outside of JBoss itself.");
-      }     
-   }
-
-   /**
-    * Instantiate and register a service for the given classname into the MBean server.
-    */
-   private ObjectName createMBean(final String classname, String name)
-      throws Exception
-   {
-      ObjectName mbeanName = null;
-      if( name != null )
-         mbeanName = new ObjectName(name);
-      try
-      {
-         // See if there is an xmbean descriptor for the bootstrap mbean
-         URL xmbeanDD = new URL("resource:xmdesc/"+classname+"-xmbean.xml");
-         Object resource = server.instantiate(classname);
-         // Create the XMBean
-         Object[] args = {resource, xmbeanDD};
-         String[] sig = {Object.class.getName(), URL.class.getName()};
-         ObjectInstance instance = server.createMBean("org.jboss.mx.modelmbean.XMBean",
-                                       mbeanName,
-                                       bootstrapUCLName,
-                                       args,
-                                       sig);
-         mbeanName = instance.getObjectName();
-         log.debug("Created system XMBean: "+mbeanName);
-      }
-      catch(Exception e)
-      {
-         log.debug("Failed to create xmbean for: "+classname);
-         mbeanName = server.createMBean(classname, mbeanName).getObjectName();
-         log.debug("Created system MBean: " + mbeanName);
-      }
-
-      return mbeanName;
-   }
-
-   /**
-    * Instantiate/register, create and start a service for the given classname.
-    */
-   private ObjectName startBootService(final ObjectName controllerName,
-      final String classname, final String name)
-      throws Exception
-   {
-      ObjectName mbeanName = createMBean(classname, name);
-
-      // now go through the create/start sequence on the new service
-
-      Object[] args = { mbeanName };
-      String[] sig = { ObjectName.class.getName() };
-
-      server.invoke(controllerName, "create", args, sig);
-      server.invoke(controllerName, "start", args, sig);
-
-      return mbeanName;
-   }
-
-   /**
-    * Initialize the boot libraries.
-    */
-   private RepositoryClassLoader initBootLibraries() throws Exception
-   {
-      // Build the list of URL for the spine to boot
-      List list = new ArrayList();
-
-      // Add the patch URL.  If the url protocol is file, then
-      // add the contents of the directory it points to
-      URL patchURL = config.getPatchURL();
-      if (patchURL != null)
-      {
-         if (patchURL.getProtocol().equals("file"))
-         {
-            File dir = new File(patchURL.getFile());
-            if (dir.exists())
-            {
-               // Add the local file patch directory
-               list.add(dir.toURL());
-
-               // Add the contents of the directory too
-               File[] jars = dir.listFiles(new FileSuffixFilter(new String[] { ".jar", ".zip" }, true));
-
-               for (int j = 0; jars != null && j < jars.length; j++)
-               {
-                  list.add(jars[j].getCanonicalFile().toURL());
-               }
-            }
-         }
-         else
-         {
-            list.add(patchURL);
-         }
-      }
-
-      // Add the server configuration directory to be able to load config files as resources
-      list.add(config.getServerConfigURL());
-
-      // Not needed, ServerImpl will have the basics on its classpath from ServerLoader
-      // may want to bring this back at some point if we want to have reloadable core
-      // components...
-
-      // URL libraryURL = config.getLibraryURL();
-      // list.add(new URL(libraryURL, "jboss-spine.jar"));
-
-      log.debug("Boot url list: " + list);
-
-      // Create loaders for each URL
-      RepositoryClassLoader loader = null;
-      for (Iterator iter = list.iterator(); iter.hasNext();)
-      {
-         URL url = (URL)iter.next();
-         log.debug("Creating loader for URL: " + url);
-
-         // This is a boot URL, so key it on itself.
-         Object[] args = {url, Boolean.TRUE};
-         String[] sig = {"java.net.URL", "boolean"};
-         loader = (RepositoryClassLoader) server.invoke(DEFAULT_LOADER_NAME, "newClassLoader", args, sig);
-      }
-      return loader;
-   }
-
-   /**
-    * Shutdown the Server instance and run shutdown hooks.
-    *
-    * <p>If the exit on shutdown flag is true, then {@link #exit}
-    *    is called, else only the shutdown hook is run.
-    *
-    * @jmx:managed-operation
-    *
-    * @throws IllegalStateException    No started.
-    */
-   public void shutdown() throws IllegalStateException
-   {
-      if (log.isTraceEnabled())
-         log.trace("Shutdown caller:", new Throwable("Here"));
-      
-      if (!started)
-         throw new IllegalStateException("Server not started");
-
-      isInShutdown = true;
-      boolean exitOnShutdown = config.getExitOnShutdown();
-      boolean blockingShutdown = config.getBlockingShutdown();
-      log.info("Shutting down the server, blockingShutdown: " + blockingShutdown);
-      
-      if (exitOnShutdown)
-      {
-         exit(0);
-      }
-      else
-      {
-         // signal lifethread to exit; if no non-daemon threads
-         // remain, the JVM will eventually exit
-         lifeThread.interrupt();
-         
-         if (blockingShutdown)
-         {
-            shutdownHook.shutdown();
-         }
-         else
-         {
-            // start in new thread to give positive
-            // feedback to requesting client of success.
-            new Thread()
-            {
-               public void run()
-               {
-                  // just run the hook, don't call System.exit, as we may
-                  // be embeded in a vm that would not like that very much
-                  shutdownHook.shutdown();
-               }
-            }.start();
-         }
-      }
-   }
-
-   /**
-    * Exit the JVM, run shutdown hooks, shutdown the server.
-    *
-    * @jmx:managed-operation
-    *
-    * @param exitcode   The exit code returned to the operating system.
-    */
-   public void exit(final int exitcode)
-   {
-      // exit() in new thread so that we might have a chance to give positive
-      // feed back to requesting client of success.      
-      new Thread()
-      {
-         public void run()
-         {
-            log.info("Server exit(" + exitcode + ") called");
-            
-            // Set exit code in the shutdown hook, in case halt is enabled
-            shutdownHook.setHaltExitCode(exitcode); 
-            
-            // Initiate exiting, shutdown hook will be called
-            Runtime.getRuntime().exit(exitcode);
-         }
-      }.start();
-   }
-
-   /**
-    * Exit the JVM with code 1, run shutdown hooks, shutdown the server.
-    *
-    * @jmx:managed-operation
-    */
-   public void exit()
-   {
-      exit(1);
-   }
-
-   /**
-    * Forcibly terminates the currently running Java virtual machine.
-    *
-    * @param exitcode   The exit code returned to the operating system.
-    *
-    * @jmx:managed-operation
-    */
-   public void halt(final int exitcode)
-   {
-      // halt() in new thread so that we might have a chance to give positive
-      // feed back to requesting client of success.
-      new Thread()
-      {
-         public void run()
-         {
-            System.err.println("Server halt(" + exitcode + ") called, halting the JVM now!");
-            Runtime.getRuntime().halt(exitcode);
-         }
-      }.start();
-   }
-
-   /**
-    * Forcibly terminates the currently running Java virtual machine.
-    * Halts with code 1.
-    *
-    * @jmx:managed-operation
-    */
-   public void halt()
-   {
-      halt(1);
-   }
-
-
-   ///////////////////////////////////////////////////////////////////////////
-   //                            Runtime Access                             //
-   ///////////////////////////////////////////////////////////////////////////
-
-   /** A simple helper used to log the Runtime memory information. */
-   private void logMemoryUsage(final Runtime rt)
-   {
-      log.info("Total/free memory: " + rt.totalMemory() + "/" + rt.freeMemory());
-   }
-
-   /**
-    * Hint to the JVM to run the garbage collector.
-    *
-    * @jmx:managed-operation
-    */
-   public void runGarbageCollector()
-   {
-      Runtime rt = Runtime.getRuntime();
-
-      logMemoryUsage(rt);
-      rt.gc();
-      log.info("Hinted to the JVM to run garbage collection");
-      logMemoryUsage(rt);
-   }
-
-   /**
-    * Hint to the JVM to run any pending object finailizations.
-    *
-    * @jmx:managed-operation
-    */
-   public void runFinalization()
-   {
-      Runtime.getRuntime().runFinalization();
-      log.info("Hinted to the JVM to run any pending object finalizations");
-   }
-
-   /**
-    * Enable or disable tracing method calls at the Runtime level.
-    *
-    * @jmx:managed-operation
-    */
-   public void traceMethodCalls(final Boolean flag)
-   {
-      Runtime.getRuntime().traceMethodCalls(flag.booleanValue());
-   }
-
-   /**
-    * Enable or disable tracing instructions the Runtime level.
-    *
-    * @jmx:managed-operation
-    */
-   public void traceInstructions(final Boolean flag)
-   {
-      Runtime.getRuntime().traceInstructions(flag.booleanValue());
-   }
-
-
-   ///////////////////////////////////////////////////////////////////////////
-   //                          Server Information                           //
-   ///////////////////////////////////////////////////////////////////////////
-
-   /**
-    * @jmx:managed-attribute
-    */
-   public Date getStartDate()
-   {
-      return startDate;
-   }
-
-   /**
-    * @jmx:managed-attribute
-    */
-   public String getVersion()
-   {
-      return version.toString();
-   }
-
-   /**
-    * @jmx:managed-attribute
-    */
-   public String getVersionName()
-   {
-      return version.getName();
-   }
-
-   /**
-    * @jmx:managed-attribute
-    */
-   public String getBuildNumber()
-   {
-      return version.getBuildNumber();
-   }
-
-   /**
-    * @jmx:managed-attribute
-    */
-   public String getBuildJVM()
-   {
-      return version.getBuildJVM();
-   }
-
-   /**
-    * @jmx:managed-attribute
-    */
-   public String getBuildOS()
-   {
-      return version.getBuildOS();
-   }
-
-   /**
-    * @jmx:managed-attribute
-    */
-   public String getBuildID()
-   {
-      return version.getBuildID();
-   }
-
-   /**
-    * @jmx:managed-attribute
-    */
-   public String getBuildDate()
-   {
-      return version.getBuildDate();
-   }
-
-   ///////////////////////////////////////////////////////////////////////////
-   //                          NotificationEmitter                          //
-   ///////////////////////////////////////////////////////////////////////////
-   
-   public void addNotificationListener(NotificationListener listener, NotificationFilter filter, Object handback)
-   {
-      broadcasterSupport.addNotificationListener(listener, filter, handback);
-   }
-   
-   public void removeNotificationListener(NotificationListener listener) throws ListenerNotFoundException
-   {
-      broadcasterSupport.removeNotificationListener(listener);
-   }
-   
-   public void removeNotificationListener(NotificationListener listener, NotificationFilter filter, Object handback)
-      throws ListenerNotFoundException
-   {
-      broadcasterSupport.removeNotificationListener(listener, filter, handback);
-   }
-      
-   public MBeanNotificationInfo[] getNotificationInfo()
-   {
-      return broadcasterSupport.getNotificationInfo();
-   }
-   
-   public void sendNotification(Notification notification)
-   {
-      broadcasterSupport.sendNotification(notification);
-   }
-   
-   ///////////////////////////////////////////////////////////////////////////
-   //                             Lifecycle Thread                          //
-   ///////////////////////////////////////////////////////////////////////////
-   
-   /** A simple thread that keeps the vm alive in the event there are no
-    * other threads started.
-    */ 
-   private class LifeThread
-      extends Thread
-   {
-      Object lock = new Object();
-      LifeThread()
-      {
-         super("JBossLifeThread");
-      }
-      public void run()
-      {
-         synchronized (lock)
-         {
-            try
-            {
-               lock.wait();
-            }
-            catch (InterruptedException ignore)
-            {
-            }
-         }
-         log.debug("LifeThread.run() exits!");
-      }
-   }
-
-   ///////////////////////////////////////////////////////////////////////////
-   //                             Shutdown Hook                             //
-   ///////////////////////////////////////////////////////////////////////////
-
-   private class ShutdownHook
-      extends Thread
-   {
-      /** The ServiceController which we will ask to shut things down with. */
-      private ObjectName controller;
-
-      /** The MainDeployer which we will ask to undeploy everything. */
-      private ObjectName mainDeployer;
-
-      /** Whether to halt the JMV at the end of the shutdown hook */
-      private boolean forceHalt = true;
-      
-      /** The exit code to use if forceHalt is enabled */
-      private int haltExitCode;
-
-      /** Mark when shutdown has been performed */
-      private boolean shutdownCalled;
-      
-      public ShutdownHook(final ObjectName controller, final ObjectName mainDeployer)
-      {
-         super("JBoss Shutdown Hook");
-
-         this.controller = controller;
-         this.mainDeployer = mainDeployer;
-
-         String value = System.getProperty("jboss.shutdown.forceHalt", null);
-         if (value != null)
-         {
-            forceHalt = new Boolean(value).booleanValue();
-         }      
-      }
-
-      public void setHaltExitCode(int haltExitCode)
-      {
-         this.haltExitCode = haltExitCode;
-      }
-      
-      public void run()
-      {
-         log.info("Runtime shutdown hook called, forceHalt: " + forceHalt);
-         
-         // shutdown the server
-         shutdown();
-
-         // Execute the jdk JBossJDKLogManager doReset
-         LogManager lm = LogManager.getLogManager();
-         if (lm instanceof JBossJDKLogManager)
-         {
-            JBossJDKLogManager jbosslm = (JBossJDKLogManager)lm;
-            jbosslm.doReset();
-         } 
-         
-         // later bitch - other shutdown hooks may be killed
-         if (forceHalt)
-         {
-            System.out.println("Halting VM");
-            Runtime.getRuntime().halt(haltExitCode);
-         }
-      }
-
-      public void shutdown()
-      {
-         if (log.isTraceEnabled())
-            log.trace("Shutdown caller:", new Throwable("Here"));
-         
-         // avoid entering twice; may happen when called directly
-         // from ServerImpl.shutdown(), then called again when all
-         // non-daemon threads have exited and the ShutdownHook runs. 
-         if (shutdownCalled)
-            return;
-         else
-            shutdownCalled = true;
-         
-         // Send a notification that server stop is initiated
-         Notification msg = new Notification(STOP_NOTIFICATION_TYPE, this, 2);
-         sendNotification(msg);
-         
-         // MainDeployer.shutdown()
-         log.info("JBoss SHUTDOWN: Undeploying all packages");
-         shutdownDeployments();
-         
-         // ServiceController.shutdown()
-         log.debug("Shutting down all services");
-         shutdownServices();
-
-         // Make sure all mbeans are unregistered
-         removeMBeans();
-
-         // Cleanup tmp/deploy dir
-         log.debug("Deleting server tmp/deploy directory");
-         File tmp = config.getServerTempDir();
-         File tmpDeploy = new File(tmp, "deploy");
-         Files.delete(tmpDeploy);
-
-         // Done
-         log.info("Shutdown complete");
-         System.out.println("Shutdown complete");
-      }
-
-      protected void shutdownDeployments()
-      {
-         try
-         {
-            // get the deployed objects from ServiceController
-            server.invoke(mainDeployer,
-                          "shutdown",
-                          new Object[0],
-                          new String[0]);
-         }
-         catch (Exception e)
-         {
-            Throwable t = JMXExceptionDecoder.decode(e);
-            log.error("Failed to shutdown deployer", t);
-         }
-      }
-
-      /**
-       * The <code>shutdownServices</code> method calls the one and only
-       * ServiceController to shut down all the mbeans registered with it.
-       */
-      protected void shutdownServices()
-      {
-         try
-         {
-            // get the deployed objects from ServiceController
-            server.invoke(controller,
-                          "shutdown",
-                          new Object[0],
-                          new String[0]);
-         }
-         catch (Exception e)
-         {
-            Throwable t = JMXExceptionDecoder.decode(e);
-            log.error("Failed to shutdown services", t);
-         }
-      }
-
-      /**
-       * The <code>removeMBeans</code> method uses the mbean server to unregister
-       * all the mbeans registered here.
-       */
-      protected void removeMBeans()
-      {
-         try
-         {
-            server.unregisterMBean(ServiceControllerMBean.OBJECT_NAME);
-            server.unregisterMBean(ServerConfigImplMBean.OBJECT_NAME);
-            server.unregisterMBean(ServerImplMBean.OBJECT_NAME);
-         }
-         catch (Exception e)
-         {
-            Throwable t = JMXExceptionDecoder.decode(e);
-            log.error("Failed to unregister mbeans", t);
-         }
-         try
-         {
-            MBeanServer registeredServer = server;
-            if (config.getPlatformMBeanServer() == true)
-               registeredServer = LazyMBeanServer.getRegisteredMBeanServer(server);
-            MBeanServerFactory.releaseMBeanServer(registeredServer);
-         }
-         catch (Exception e)
-         {
-            Throwable t = JMXExceptionDecoder.decode(e);
-            log.error("Failed to release mbean server", t);
-         }
-      }
-   }
-}

Copied: branches/MC_VDF_WORK/system-jmx/src/main/org/jboss/system/server/ServerImpl.java (from rev 55200, branches/MC_VDF_WORK/system/src/main/org/jboss/system/server/ServerImpl.java)




More information about the jboss-cvs-commits mailing list