Просмотр исходного кода

implement shutdown handler in onejar

Jason Rivard 4 лет назад
Родитель
Сommit
da16984c6b

+ 30 - 0
onejar/src/main/java/password/pwm/onejar/OnejarMain.java

@@ -20,6 +20,8 @@
 
 
 package password.pwm.onejar;
 package password.pwm.onejar;
 
 
+import org.apache.catalina.LifecycleException;
+
 import javax.servlet.ServletException;
 import javax.servlet.ServletException;
 import java.io.File;
 import java.io.File;
 import java.io.IOException;
 import java.io.IOException;
@@ -108,6 +110,7 @@ public class OnejarMain
                 purgeDirectory( onejarConfig.getWorkingPath().toPath() );
                 purgeDirectory( onejarConfig.getWorkingPath().toPath() );
                 this.explodeWar( onejarConfig );
                 this.explodeWar( onejarConfig );
                 final TomcatOnejarRunner runner = new TomcatOnejarRunner( this );
                 final TomcatOnejarRunner runner = new TomcatOnejarRunner( this );
+                Runtime.getRuntime().addShutdownHook( new ShutdownThread( runner ) );
                 runner.startTomcat( onejarConfig );
                 runner.startTomcat( onejarConfig );
 
 
             }
             }
@@ -121,6 +124,33 @@ public class OnejarMain
         out( "exiting after " + duration.toString() );
         out( "exiting after " + duration.toString() );
     }
     }
 
 
+    class ShutdownThread extends Thread
+    {
+        private final TomcatOnejarRunner runner;
+
+        public ShutdownThread( final TomcatOnejarRunner runner )
+        {
+            this.runner = runner;
+        }
+
+        @Override
+        public void run()
+        {
+            final Instant startTime = Instant.now();
+            out("shutdown process initiated");
+            try
+            {
+                runner.shutdown();
+            }
+            catch ( final LifecycleException e )
+            {
+                e.printStackTrace();
+            }
+            final Duration duration = Duration.between( startTime, Instant.now() );
+            out("shutdown complete (" + duration.toString() + ")" );
+        }
+    }
+
     void out( final String output )
     void out( final String output )
     {
     {
         output( output );
         output( output );

+ 14 - 3
onejar/src/main/java/password/pwm/onejar/TomcatOnejarRunner.java

@@ -20,6 +20,7 @@
 
 
 package password.pwm.onejar;
 package password.pwm.onejar;
 
 
+import org.apache.catalina.LifecycleException;
 import org.apache.catalina.connector.Connector;
 import org.apache.catalina.connector.Connector;
 import org.apache.catalina.startup.Tomcat;
 import org.apache.catalina.startup.Tomcat;
 import org.apache.catalina.util.ServerInfo;
 import org.apache.catalina.util.ServerInfo;
@@ -53,6 +54,7 @@ import java.util.stream.Collectors;
 public class TomcatOnejarRunner
 public class TomcatOnejarRunner
 {
 {
     private final OnejarMain onejarMain;
     private final OnejarMain onejarMain;
+    private Tomcat tomcat;
 
 
     public TomcatOnejarRunner( final OnejarMain onejarMain )
     public TomcatOnejarRunner( final OnejarMain onejarMain )
     {
     {
@@ -83,7 +85,7 @@ public class TomcatOnejarRunner
 
 
         setupEnv( onejarConfig );
         setupEnv( onejarConfig );
 
 
-        final Tomcat tomcat = new Tomcat();
+        tomcat = new Tomcat();
         tomcat.setSilent( true );
         tomcat.setSilent( true );
 
 
         {
         {
@@ -122,8 +124,6 @@ public class TomcatOnejarRunner
             throw new OnejarException( "unable to start tomcat: " + e.getMessage() );
             throw new OnejarException( "unable to start tomcat: " + e.getMessage() );
         }
         }
         tomcat.getServer().await();
         tomcat.getServer().await();
-
-        System.out.println( "\nexiting..." );
     }
     }
 
 
     private void deployRedirectConnector( final Tomcat tomcat, final OnejarConfig onejarConfig )
     private void deployRedirectConnector( final Tomcat tomcat, final OnejarConfig onejarConfig )
@@ -300,4 +300,15 @@ public class TomcatOnejarRunner
         }
         }
         return URLClassLoader.newInstance( jarURLList.toArray( new URL[0] ) );
         return URLClassLoader.newInstance( jarURLList.toArray( new URL[0] ) );
     }
     }
+
+    public void shutdown() throws LifecycleException
+    {
+        if ( tomcat != null )
+        {
+            final Tomcat localTomcat = tomcat;
+            localTomcat.stop();
+            localTomcat.destroy();
+            tomcat = null;
+        }
+    }
 }
 }