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() {
