changeset 879:a3775d0c6985

remove ShutdownThread
author Franklin Schmidt <fschmidt@gmail.com>
date Tue, 04 Oct 2016 15:55:02 -0600
parents 5f8a242392da
children 00b3bd6e0ada
files src/org/eclipse/jetty/server/Server.java src/org/eclipse/jetty/server/ShutdownMonitor.java src/org/eclipse/jetty/util/thread/ShutdownThread.java
diffstat 3 files changed, 0 insertions(+), 570 deletions(-) [+]
line wrap: on
line diff
--- a/src/org/eclipse/jetty/server/Server.java	Tue Oct 04 14:50:32 2016 -0600
+++ b/src/org/eclipse/jetty/server/Server.java	Tue Oct 04 15:55:02 2016 -0600
@@ -44,7 +44,6 @@
 import org.eclipse.jetty.util.component.LifeCycle;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.eclipse.jetty.util.thread.ShutdownThread;
 
 /* ------------------------------------------------------------ */
 /** Jetty HTTP Servlet Server.
@@ -65,7 +64,6 @@
 	public final ThreadPoolExecutor threadPool;
 	public final Connector connector;
 	private int _graceful=0;
-	private boolean _stopAtShutdown;
 	private boolean _dumpAfterStart=false;
 	private boolean _dumpBeforeStop=false;
 	private boolean _uncheckedPrintWriter=false;
@@ -93,32 +91,6 @@
 		return __version;
 	}
 
-	/* ------------------------------------------------------------ */
-	public boolean getStopAtShutdown()
-	{
-		return _stopAtShutdown;
-	}
-
-	/* ------------------------------------------------------------ */
-	public void setStopAtShutdown(boolean stop)
-	{
-		//if we now want to stop
-		if (stop)
-		{
-			//and we weren't stopping before
-			if (!_stopAtShutdown)
-			{  
-				//only register to stop if we're already started (otherwise we'll do it in doStart())
-				if (isStarted()) 
-					ShutdownThread.register(this);
-			}
-		}
-		else
-			ShutdownThread.deregister(this);
-		
-		_stopAtShutdown=stop;
-	}
-
 	/**
 	 * @return true if {@link #dumpStdErr()} is called after starting
 	 */
@@ -157,13 +129,6 @@
 	@Override
 	protected void doStart() throws Exception
 	{
-		if (getStopAtShutdown())
-		{
-			ShutdownThread.register(this);    
-		}
-		
-		ShutdownMonitor.getInstance().start(); // initialize
-
 		LOG.info("jetty-"+__version);
 		HttpGenerator.setServerVersion(__version);
 		
@@ -224,9 +189,6 @@
 		try {super.doStop(); } catch(Throwable e) { mex.add(e);}
 
 		mex.ifExceptionThrow();
-
-		if (getStopAtShutdown())
-			ShutdownThread.deregister(this);
 	}
 
 	/* ------------------------------------------------------------ */
--- a/src/org/eclipse/jetty/server/ShutdownMonitor.java	Tue Oct 04 14:50:32 2016 -0600
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,384 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2014 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.server;
-
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.io.LineNumberReader;
-import java.io.OutputStream;
-import java.net.InetAddress;
-import java.net.ServerSocket;
-import java.net.Socket;
-import java.util.Properties;
-
-import org.eclipse.jetty.util.StringUtil;
-import org.eclipse.jetty.util.thread.ShutdownThread;
-
-/**
- * Shutdown/Stop Monitor thread.
- * <p>
- * This thread listens on the port specified by the STOP.PORT system parameter (defaults to -1 for not listening) for request authenticated with the key given
- * by the STOP.KEY system parameter (defaults to "eclipse") for admin requests.
- * <p>
- * If the stop port is set to zero, then a random port is assigned and the port number is printed to stdout.
- * <p>
- * Commands "stop" and "status" are currently supported.
- */
-public class ShutdownMonitor 
-{
-    // Implementation of safe lazy init, using Initialization on Demand Holder technique.
-    static class Holder
-    {
-        static ShutdownMonitor instance = new ShutdownMonitor();
-    }
-
-    public static ShutdownMonitor getInstance()
-    {
-        return Holder.instance;
-    }
-
-    /**
-     * ShutdownMonitorThread
-     *
-     * Thread for listening to STOP.PORT for command to stop Jetty.
-     * If ShowndownMonitor.exitVm is true, then Sytem.exit will also be
-     * called after the stop.
-     *
-     */
-    public class ShutdownMonitorThread extends Thread
-    {
-
-        public ShutdownMonitorThread ()
-        {
-            setDaemon(true);
-            setName("ShutdownMonitor");
-        }
-        
-        @Override
-        public void run()
-        {
-            if (serverSocket == null)
-            {
-                return;
-            }
-
-            while (serverSocket != null)
-            {
-                Socket socket = null;
-                try
-                {
-                    socket = serverSocket.accept();
-
-                    LineNumberReader lin = new LineNumberReader(new InputStreamReader(socket.getInputStream()));
-                    String receivedKey = lin.readLine();
-                    if (!key.equals(receivedKey))
-                    {
-                        System.err.println("Ignoring command with incorrect key");
-                        continue;
-                    }
-
-                    OutputStream out = socket.getOutputStream();
-
-                    String cmd = lin.readLine();
-                    debug("command=%s",cmd);
-                    if ("stop".equals(cmd))
-                    {
-                        // Graceful Shutdown
-                        debug("Issuing graceful shutdown..");
-                        ShutdownThread.getInstance().run();
-
-                        // Reply to client
-                        debug("Informing client that we are stopped.");
-                        out.write("Stopped\r\n".getBytes(StringUtil.__UTF8));
-                        out.flush();
-
-                        // Shutdown Monitor
-                        debug("Shutting down monitor");
-                        close(socket);
-                        socket = null;
-                        close(serverSocket);
-                        serverSocket = null;
-
-                        if (exitVm)
-                        {
-                            // Kill JVM
-                            debug("Killing JVM");
-                            System.exit(0);
-                        }
-                    }
-                    else if ("status".equals(cmd))
-                    {
-                        // Reply to client
-                        out.write("OK\r\n".getBytes(StringUtil.__UTF8));
-                        out.flush();
-                    }
-                }
-                catch (Exception e)
-                {
-                    debug(e);
-                    System.err.println(e.toString());
-                }
-                finally
-                {
-                    close(socket);
-                    socket = null;
-                }
-            }
-        }
-        
-        public void start()
-        {
-            if (isAlive())
-            {
-                System.err.printf("ShutdownMonitorThread already started");
-                return; // cannot start it again
-            }
-
-            startListenSocket();
-            
-            if (serverSocket == null)
-            {
-                return;
-            }
-            if (DEBUG)
-                System.err.println("Starting ShutdownMonitorThread");
-            super.start();
-        }
-        
-        private void startListenSocket()
-        {
-            if (port < 0)
-            {            
-                if (DEBUG)
-                    System.err.println("ShutdownMonitor not in use (port < 0): " + port);
-                return;
-            }
-
-            try
-            {
-                serverSocket = new ServerSocket(port,1,InetAddress.getByName("127.0.0.1"));
-                if (port == 0)
-                {
-                    // server assigned port in use
-                    port = serverSocket.getLocalPort();
-                    System.out.printf("STOP.PORT=%d%n",port);
-                }
-
-                if (key == null)
-                {
-                    // create random key
-                    key = Long.toString((long)(Long.MAX_VALUE * Math.random() + this.hashCode() + System.currentTimeMillis()),36);
-                    System.out.printf("STOP.KEY=%s%n",key);
-                }
-            }
-            catch (Exception e)
-            {
-                debug(e);
-                System.err.println("Error binding monitor port " + port + ": " + e.toString());
-                serverSocket = null;
-            }
-            finally
-            {
-                // establish the port and key that are in use
-                debug("STOP.PORT=%d",port);
-                debug("STOP.KEY=%s",key);
-                debug("%s",serverSocket);
-            }
-        }
-
-    }
-    
-    private boolean DEBUG;
-    private int port;
-    private String key;
-    private boolean exitVm;
-    private ServerSocket serverSocket;
-    private ShutdownMonitorThread thread;
-    
-    
-
-    /**
-     * Create a ShutdownMonitor using configuration from the System properties.
-     * <p>
-     * <code>STOP.PORT</code> = the port to listen on (empty, null, or values less than 0 disable the stop ability)<br>
-     * <code>STOP.KEY</code> = the magic key/passphrase to allow the stop (defaults to "eclipse")<br>
-     * <p>
-     * Note: server socket will only listen on localhost, and a successful stop will issue a System.exit() call.
-     */
-    private ShutdownMonitor()
-    {
-        Properties props = System.getProperties();
-
-        this.DEBUG = props.containsKey("DEBUG");
-
-        // Use values passed thru via /jetty-start/
-        this.port = Integer.parseInt(props.getProperty("STOP.PORT","-1"));
-        this.key = props.getProperty("STOP.KEY",null);
-        this.exitVm = true;
-    }
-
-    private void close(ServerSocket server)
-    {
-        if (server == null)
-        {
-            return;
-        }
-
-        try
-        {
-            server.close();
-        }
-        catch (IOException ignore)
-        {
-            /* ignore */
-        }
-    }
-
-    private void close(Socket socket)
-    {
-        if (socket == null)
-        {
-            return;
-        }
-
-        try
-        {
-            socket.close();
-        }
-        catch (IOException ignore)
-        {
-            /* ignore */
-        }
-    }
-
-    private void debug(String format, Object... args)
-    {
-        if (DEBUG)
-        {
-            System.err.printf("[ShutdownMonitor] " + format + "%n",args);
-        }
-    }
-
-    private void debug(Throwable t)
-    {
-        if (DEBUG)
-        {
-            t.printStackTrace(System.err);
-        }
-    }
-
-    public String getKey()
-    {
-        return key;
-    }
-
-    public int getPort()
-    {
-        return port;
-    }
-
-    public ServerSocket getServerSocket()
-    {
-        return serverSocket;
-    }
-
-    public boolean isExitVm()
-    {
-        return exitVm;
-    }
-
-
-    public void setDebug(boolean flag)
-    {
-        this.DEBUG = flag;
-    }
-
-    public void setExitVm(boolean exitVm)
-    {
-        synchronized (this)
-        {
-            if (thread != null && thread.isAlive())
-            {
-                throw new IllegalStateException("ShutdownMonitorThread already started");
-            }
-            this.exitVm = exitVm;
-        }
-    }
-
-    public void setKey(String key)
-    {
-        synchronized (this)
-        {
-            if (thread != null && thread.isAlive())
-            {
-                throw new IllegalStateException("ShutdownMonitorThread already started");
-            }
-            this.key = key;
-        }
-    }
-
-    public void setPort(int port)
-    {
-        synchronized (this)
-        {
-            if (thread != null && thread.isAlive())
-            {
-                throw new IllegalStateException("ShutdownMonitorThread already started");
-            }
-            this.port = port;
-        }
-    }
-
-    protected void start() throws Exception
-    {
-        ShutdownMonitorThread t = null;
-        synchronized (this)
-        {
-            if (thread != null && thread.isAlive())
-            {
-                System.err.printf("ShutdownMonitorThread already started");
-                return; // cannot start it again
-            }
-         
-            thread = new ShutdownMonitorThread();
-            t = thread;
-        }
-         
-        if (t != null)
-            t.start();
-    }
-
-
-    protected boolean isAlive ()
-    {
-        boolean result = false;
-        synchronized (this)
-        {
-            result = (thread != null && thread.isAlive());
-        }
-        return result;
-    }
-    
- 
-    @Override
-    public String toString()
-    {
-        return String.format("%s[port=%d]",this.getClass().getName(),port);
-    }
-}
--- a/src/org/eclipse/jetty/util/thread/ShutdownThread.java	Tue Oct 04 14:50:32 2016 -0600
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,148 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2014 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.util.thread;
-
-import java.util.Arrays;
-import java.util.List;
-import java.util.concurrent.CopyOnWriteArrayList;
-
-import org.eclipse.jetty.util.component.Destroyable;
-import org.eclipse.jetty.util.component.LifeCycle;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-
-/* ------------------------------------------------------------ */
-/**
- * ShutdownThread is a shutdown hook thread implemented as 
- * singleton that maintains a list of lifecycle instances
- * that are registered with it and provides ability to stop
- * these lifecycles upon shutdown of the Java Virtual Machine 
- */
-public class ShutdownThread extends Thread
-{
-    private static final Logger LOG = LoggerFactory.getLogger(ShutdownThread.class);
-    private static final ShutdownThread _thread = new ShutdownThread();
-
-    private boolean _hooked;
-    private final List<LifeCycle> _lifeCycles = new CopyOnWriteArrayList<LifeCycle>();
-
-    /* ------------------------------------------------------------ */
-    /**
-     * Default constructor for the singleton
-     * 
-     * Registers the instance as shutdown hook with the Java Runtime
-     */
-    private ShutdownThread()
-    {
-    }
-    
-    /* ------------------------------------------------------------ */
-    private synchronized void hook()
-    {
-        try
-        {
-            if (!_hooked)
-                Runtime.getRuntime().addShutdownHook(this);
-            _hooked=true;
-        }
-        catch(Exception e)
-        {
-            LOG.trace("",e);
-            LOG.info("shutdown already commenced");
-        }
-    }
-    
-    /* ------------------------------------------------------------ */
-    private synchronized void unhook()
-    {
-        try
-        {
-            _hooked=false;
-            Runtime.getRuntime().removeShutdownHook(this);
-        }
-        catch(Exception e)
-        {
-            LOG.trace("",e);
-            LOG.debug("shutdown already commenced");
-        }
-    }
-    
-    /* ------------------------------------------------------------ */
-    /**
-     * Returns the instance of the singleton
-     * 
-     * @return the singleton instance of the {@link ShutdownThread}
-     */
-    public static ShutdownThread getInstance()
-    {
-        return _thread;
-    }
-
-    /* ------------------------------------------------------------ */
-    public static synchronized void register(LifeCycle... lifeCycles)
-    {
-        _thread._lifeCycles.addAll(Arrays.asList(lifeCycles));
-        if (_thread._lifeCycles.size()>0)
-            _thread.hook();
-    }
-
-    /* ------------------------------------------------------------ */
-    public static synchronized void register(int index, LifeCycle... lifeCycles)
-    {
-        _thread._lifeCycles.addAll(index,Arrays.asList(lifeCycles));
-        if (_thread._lifeCycles.size()>0)
-            _thread.hook();
-    }
-    
-    /* ------------------------------------------------------------ */
-    public static synchronized void deregister(LifeCycle lifeCycle)
-    {
-        _thread._lifeCycles.remove(lifeCycle);
-        if (_thread._lifeCycles.size()==0)
-            _thread.unhook();
-    }
-
-    /* ------------------------------------------------------------ */
-    @Override
-    public void run()
-    {
-        for (LifeCycle lifeCycle : _thread._lifeCycles)
-        {
-            try
-            {
-                if (lifeCycle.isStarted())
-                {
-                    lifeCycle.stop();
-                    LOG.debug("Stopped {}",lifeCycle);
-                }
-                
-                if (lifeCycle instanceof Destroyable)
-                {
-                    ((Destroyable)lifeCycle).destroy();
-                    LOG.debug("Destroyed {}",lifeCycle);
-                }
-            }
-            catch (Exception ex)
-            {
-                LOG.debug("",ex);
-            }
-        }
-    }
-}