That’s exactly what I did. The listener is not called at all. Looking at bundles, some are Active, some Resolved, one Installed (OSGi System Bundle 3.10.2.v20150203-1939) and one Waiting (one of mine).
public final class KarafStopper { private static final Logger LOG = LogManager.getLogger(KarafStopper.class); private static final long TIMEOUT = 3 * 1000; // in milliseconds private final Bundle karaf; public KarafStopper(final BundleContext context) { System.out.println("=> blabla"); karaf = context.getBundle(0); karaf.getBundleContext().addBundleListener(new SynchronousBundleListener() { @Override public void bundleChanged(final BundleEvent event) { System.out.println("Karaf: " + event.getType()); } }); } public void shutdown() { try { final Thread watchdog = new Thread(() -> { try { Thread.sleep(TIMEOUT); // Karaf refuses to stop LOG.error(() -> "Karaf did not stop gracefully"); System.exit(-1); } catch (final InterruptedException e) { // Karaf stopped normally } }); watchdog.setDaemon(true); watchdog.start(); System.out.println("Bye bye"); karaf.stop(Bundle.STOP_TRANSIENT); System.out.println("So long!"); } catch (final BundleException e) { System.out.println("Oooooooooooops: " + e); LOG.error(() -> "Issue while stopping karaf", e); } } } Regards, JP De : Guillaume Nodet [mailto:gno...@apache.org] Envoyé : vendredi 18 novembre 2016 13:01 À : user Objet : Re: Karaf shutdown Can you write a simple SynchronousBundleListener that prints to stdout all received events and paste the output when stopping the framework for felix and equinox ? 2016-11-18 12:10 GMT+01:00 CLEMENT Jean-Philippe <jean-philippe.clem...@fr.thalesgroup.com<mailto:jean-philippe.clem...@fr.thalesgroup.com>>: Well, that’s not the case when a bundle refuses to stop – I get no event. Ah I forgot to mention that Equinox is used instead of Felix. May I open a bug for this? Regards, JP De : Guillaume Nodet [mailto:gno...@apache.org<mailto:gno...@apache.org>] Envoyé : vendredi 18 novembre 2016 11:52 À : user Objet : Re: Karaf shutdown The SynchronousBundleListener is the way to go. You should receive a STOPPING event for the system bundle before any other bundle is actually stopped. 2016-11-18 11:38 GMT+01:00 CLEMENT Jean-Philippe <jean-philippe.clem...@fr.thalesgroup.com<mailto:jean-philippe.clem...@fr.thalesgroup.com>>: Is there a way to get a shutdown event? Regards, JP De : CLEMENT Jean-Philippe [mailto:jean-philippe.clem...@fr.thalesgroup.com<mailto:jean-philippe.clem...@fr.thalesgroup.com>] Envoyé : jeudi 17 novembre 2016 17:03 À : user@karaf.apache.org<mailto:user@karaf.apache.org> Objet : Karaf shutdown Dear Karaf addicts :) I would like Karaf to stop. This may fail to happen when (at least) a bundle does not end. So I added a watchdog which exits Java when a time limit has been exceeded (note: maybe there is already a way to do so - ?). The way I coded it does not work when the shutdown is made via the Karaf prompt, so I decided to enhance it. Googling “Karaf shutdown hook”, I found an old thread talking about SynchronousBundleListener. The issue I’m facing is that I get no event when performing bundle0.stop(Bundle.STOP_TRANSIENT) and one of the bundles refuses to stop. The listener is registered via bundle0.getBundleContext().addBundleListener(new SynchronousBundleListener() { … }). Is it normal? How to force Karaf to shutdown? PS: Karaf version is 4.0.7 JP -- ------------------------ Guillaume Nodet ------------------------ Red Hat, Open Source Integration Email: gno...@redhat.com<mailto:gno...@redhat.com> Web: http://fusesource.com<http://fusesource.com/> Blog: http://gnodet.blogspot.com/ -- ------------------------ Guillaume Nodet ------------------------ Red Hat, Open Source Integration Email: gno...@redhat.com<mailto:gno...@redhat.com> Web: http://fusesource.com<http://fusesource.com/> Blog: http://gnodet.blogspot.com/