You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@karaf.apache.org by jb...@apache.org on 2016/06/21 19:12:43 UTC

karaf git commit: [KARAF-4569] OSGi framework is not shut-down gracefully on SIGTERM

Repository: karaf
Updated Branches:
  refs/heads/karaf-4.0.x f2026c5b3 -> f2ad08df8


[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/f2ad08df
Tree: http://git-wip-us.apache.org/repos/asf/karaf/tree/f2ad08df
Diff: http://git-wip-us.apache.org/repos/asf/karaf/diff/f2ad08df

Branch: refs/heads/karaf-4.0.x
Commit: f2ad08df8f3dd06384964ccdbc1db53f915e43a0
Parents: f2026c5
Author: lburgazzoli <lb...@gmail.com>
Authored: Mon Jun 13 20:08:10 2016 +0200
Committer: Jean-Baptiste Onofr� <jb...@apache.org>
Committed: Tue Jun 21 21:12:24 2016 +0200

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


http://git-wip-us.apache.org/repos/asf/karaf/blob/f2ad08df/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 7f9bfff..9498082 100644
--- a/main/src/main/java/org/apache/karaf/main/Main.java
+++ b/main/src/main/java/org/apache/karaf/main/Main.java
@@ -23,6 +23,9 @@ import java.io.File;
 import java.io.InputStream;
 import java.io.InputStreamReader;
 import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Method;
+import java.lang.reflect.Proxy;
 import java.net.URI;
 import java.net.URL;
 import java.net.URLClassLoader;
@@ -30,12 +33,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;
@@ -320,6 +322,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() {