Repository: karaf
Updated Branches:
  refs/heads/master 6862b6288 -> cc8dfd9eb


KARAF-4569: OSGi framework is not shut-down gracefully on SIGTERM


Project: http://git-wip-us.apache.org/repos/asf/karaf/repo
Commit: http://git-wip-us.apache.org/repos/asf/karaf/commit/cb9a94a2
Tree: http://git-wip-us.apache.org/repos/asf/karaf/tree/cb9a94a2
Diff: http://git-wip-us.apache.org/repos/asf/karaf/diff/cb9a94a2

Branch: refs/heads/master
Commit: cb9a94a215d9d9d435a59ce02c027d0d0382f101
Parents: 8228782
Author: lburgazzoli <[email protected]>
Authored: Mon Jun 13 20:08:10 2016 +0200
Committer: lburgazzoli <[email protected]>
Committed: Wed Jun 15 08:30:35 2016 +0200

----------------------------------------------------------------------
 .../main/java/org/apache/karaf/main/Main.java   | 36 ++++++++++++++++++--
 1 file changed, 34 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/karaf/blob/cb9a94a2/main/src/main/java/org/apache/karaf/main/Main.java
----------------------------------------------------------------------
diff --git a/main/src/main/java/org/apache/karaf/main/Main.java 
b/main/src/main/java/org/apache/karaf/main/Main.java
index 532847f..09a3dc1 100644
--- a/main/src/main/java/org/apache/karaf/main/Main.java
+++ b/main/src/main/java/org/apache/karaf/main/Main.java
@@ -23,8 +23,10 @@ import java.io.File;
 import java.io.InputStream;
 import java.io.InputStreamReader;
 import java.lang.reflect.Field;
+import java.lang.reflect.InvocationHandler;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
+import java.lang.reflect.Proxy;
 import java.net.URI;
 import java.net.URL;
 import java.net.URLClassLoader;
@@ -32,12 +34,11 @@ import java.security.Provider;
 import java.security.Security;
 import java.util.ArrayList;
 import java.util.List;
-import org.apache.felix.utils.properties.Properties;
-
 import java.util.StringTokenizer;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
+import org.apache.felix.utils.properties.Properties;
 import org.apache.karaf.info.ServerInfo;
 import org.apache.karaf.main.lock.Lock;
 import org.apache.karaf.main.lock.LockCallBack;
@@ -319,6 +320,37 @@ public class Main {
             new StartupListener(LOG, framework.getBundleContext());
         }
         monitor();
+        registerSignalHandler();
+    }
+
+    private void registerSignalHandler() {
+        if (!Boolean.valueOf(System.getProperty("karaf.handle.sigterm", 
"true"))) {
+            return;
+        }
+
+        try {
+            final Class<?> signalClass = Class.forName("sun.misc.Signal");
+            final Class<?> signalHandlerClass = 
Class.forName("sun.misc.SignalHandler");
+
+            Object signalHandler = 
Proxy.newProxyInstance(getClass().getClassLoader(),
+                new Class<?>[] {
+                    signalHandlerClass
+                },
+                new InvocationHandler() {
+                    public Object invoke(Object proxy, Method method, Object[] 
args) throws Throwable {
+                        Main.this.destroy();
+                        return null;
+                    }
+                }
+            );
+
+            signalClass.getMethod("handle", signalClass, 
signalHandlerClass).invoke(
+                null,
+                signalClass.getConstructor(String.class).newInstance("TERM"),
+                signalHandler
+            );
+        } catch (Exception e) {
+        }
     }
 
     private void monitor() {

Reply via email to