Would be great ! It would also be nice to be able to call it programmatically, or, at least have a default shutdown timeout.
May I open a Jira? Regards, JP -----Message d'origine----- De : Jean-Baptiste Onofré [mailto:[email protected]] Envoyé : lundi 21 novembre 2016 10:27 À : [email protected] Objet : Re: Karaf shutdown +1 Regards JB On 11/21/2016 10:25 AM, Guillaume Nodet wrote: > We could easily add an option to the shutdown command for that. > > 2016-11-21 10:21 GMT+01:00 CLEMENT Jean-Philippe > <[email protected] > <mailto:[email protected]>>: > > Ok, things clear, thank you for the detailed explanation :)____ > > __ __ > > In fact I just want to ensure Karaf to shut down within a given time > limit. Is there a way to do so?____ > > __ __ > > Regards,____ > > JP____ > > __ __ > > *De :*Guillaume Nodet [mailto:[email protected] > <mailto:[email protected]>] > *Envoyé :* vendredi 18 novembre 2016 20:16 > > > *À :* user > *Objet :* Re: Karaf shutdown____ > > __ __ > > __ __ > > __ __ > > 2016-11-18 17:58 GMT+01:00 CLEMENT Jean-Philippe > <[email protected] > <mailto:[email protected]>>:____ > > Well, I’m not too sure to understand :)____ > > ____ > > I will only focus on bundle 0 and the stopping event I’m expecting > from it. So, I put “that” bundle listener on the bundle 0 not on any > other bundle. But, the way I get the bundle 0 is via a bundleContext > which is injected via Blueprint.____ > > ____ > > That said, the spec says I should first get the event. Should not be > tied to the actual stopping order, isn’t it (Blueprint or > not)?____ > > __ __ > > The STOPPING events are distributed to various listeners > synchronously. The blueprint extender will receive it before your > own listener (because it's registered before), so the preemptive > shutdown will take place before you can do anything. This also > means that your bundle containing the listener will be stopped > before receiving the STOPPING event.____ > > Note that the purpose of this behavior is to avoid having blueprint > bundles trying to call a missing mandatory dependency during > shutdown, amongst other things. If your bundle stuck waiting for a > blueprint dependency or something else ? There is certainly still > some room for improvements in blueprint-core when shutting down > bundles.____ > > __ __ > > ____ > > ____ > > Regards,____ > > JP____ > > ____ > > *De :*Guillaume Nodet [mailto:[email protected] > <mailto:[email protected]>] > *Envoyé :* vendredi 18 novembre 2016 17:04____ > > > *À :* user > *Objet :* Re: Karaf shutdown____ > > ____ > > You have 2 events for each bundle (but for the system bundle, > the first event which is a STOPPING event).____ > > For each of those 2 events, the first one is a STOPPING, then > the framework calls the activator stop, then fire a STOPPED > event.____ > > ____ > > Are you sure you're using activators ? because the problem may > be completely different if using a blueprint extender and a > blueprint event that does not stop.____ > > In that case, what happens is that the blueprint extender > intercepts the STOPPING event from the system bundle and > preemptively shutdown all blueprint bundles in an orderly > fashion. This usually helps by choosing a better stopping order > than the default one, depending on service used between > bundles. The problem is that given the extender stops the > blueprint bundles preemptively, the bundles will be stopped > before the framework has a change to send the STOPPING event for > the bundle. It's actually the same as if you would stop the > blueprint extender in a running framework: all blueprint > containers will be destroyed, but the lifecycle of the bundles > would not be affected. This behavior can be turned off by > using____ > > *org.apache.aries.blueprint.preemptiveShutdown=false*____ > > in the etc/config.properties file.____ > > ____ > > 2016-11-18 16:49 GMT+01:00 CLEMENT Jean-Philippe > <[email protected] > <mailto:[email protected]>>:____ > > In fact I guess that’s the problem, the event seems not to be > fired before stopping bundles.____ > > ____ > > When all bundles react normally, i.e. they stop, I get the > stopping event. When at least one does not stop as expected, > then I get no stopping event. Would you be kind enough to try > again with a non-stopping-bundle and displaying the event > type?____ > > ____ > > Regards,____ > > JP____ > > ____ > > *De :*Guillaume Nodet [mailto:[email protected] > <mailto:[email protected]>] > *Envoyé :* vendredi 18 novembre 2016 16:40____ > > > *À :* user > *Objet :* Re: Karaf shutdown____ > > ____ > > ____ > > ____ > > 2016-11-18 15:01 GMT+01:00 CLEMENT Jean-Philippe > <[email protected] > <mailto:[email protected]>>:____ > > Did you also add a bundle which prevents stopping ?____ > > ____ > > No, but the first event is sent before actually stopping any > bundle.____ > > ____ > > ____ > > PS: in your traces which event is the shutdown itself?____ > > ____ > > It's not, because I paste a wrong output.____ > > Here's the full output, and the interesting event is the first > one. It's should be a */STOPPING /*event.____ > > ____ > > *karaf*@root()> ($.contextbundle 0)stop 1 > > > > > org.osgi.framework.BundleEvent[source=org.eclipse.osgi_3.10.101.v20150820-1432 > [0]]____ > > org.osgi.framework.BundleEvent[source=org.jline_3.0.1 > [34]]____ > > org.osgi.framework.BundleEvent[source=org.jline_3.0.1 > [34]]____ > > > org.osgi.framework.BundleEvent[source=org.fusesource.jansi_1.14.0 > [33]]____ > > > org.osgi.framework.BundleEvent[source=org.fusesource.jansi_1.14.0 > [33]]____ > > org.osgi.framework.BundleEvent[source=org.apache.sshd.core_1.2.0 > [32]]____ > > org.osgi.framework.BundleEvent[source=org.apache.sshd.core_1.2.0 > [32]]____ > > > org.osgi.framework.BundleEvent[source=org.apache.servicemix.bundles.not-yet-commons-ssl_0.3.11.1 > [31]]____ > > > org.osgi.framework.BundleEvent[source=org.apache.servicemix.bundles.not-yet-commons-ssl_0.3.11.1 > [31]]____ > > ...____ > > ____ > > ____ > > Regards,____ > > JP____ > > ____ > > *De :*Guillaume Nodet [mailto:[email protected] > <mailto:[email protected]>] > *Envoyé :* vendredi 18 novembre 2016 14:26____ > > > *À :* user > *Objet :* Re: Karaf shutdown____ > > ____ > > You must be doing something wrong.____ > > I added this small bit of code to one of karaf's > activators:____ > > > *bundleContext*.getBundle(0).getBundleContext().addBundleListener(*new > *SynchronousBundleListener() { > @Override > *public void *bundleChanged(BundleEvent event) { > System.*/out/*.println(event); > } > });____ > > ____ > > Here's the output when stopping under equinox:____ > > *karaf*@root()> ($.contextbundle 0)stop 1 > > > org.osgi.framework.BundleEvent[source=org.apache.karaf.shell.core_4.1.0.SNAPSHOT > [28]]____ > > > org.osgi.framework.BundleEvent[source=org.apache.karaf.shell.commands_4.1.0.SNAPSHOT > [27]]____ > > > org.osgi.framework.BundleEvent[source=org.apache.karaf.shell.commands_4.1.0.SNAPSHOT > [27]]____ > > > org.osgi.framework.BundleEvent[source=org.apache.karaf.service.core_4.1.0.SNAPSHOT > [26]]____ > > > org.osgi.framework.BundleEvent[source=org.apache.karaf.service.core_4.1.0.SNAPSHOT > [26]]____ > > > org.osgi.framework.BundleEvent[source=org.apache.karaf.package.core_4.1.0.SNAPSHOT > [25]]____ > > > org.osgi.framework.BundleEvent[source=org.apache.karaf.package.core_4.1.0.SNAPSHOT > [25]]____ > > > org.osgi.framework.BundleEvent[source=org.apache.karaf.management.server_4.1.0.SNAPSHOT > [24]]____ > > > org.osgi.framework.BundleEvent[source=org.apache.karaf.management.server_4.1.0.SNAPSHOT > [24]]____ > > > org.osgi.framework.BundleEvent[source=org.apache.karaf.log.core_4.1.0.SNAPSHOT > [23]]____ > > > org.osgi.framework.BundleEvent[source=org.apache.karaf.log.core_4.1.0.SNAPSHOT > [23]]____ > > > org.osgi.framework.BundleEvent[source=org.apache.karaf.kar.core_4.1.0.SNAPSHOT > [22]]____ > > > org.osgi.framework.BundleEvent[source=org.apache.karaf.kar.core_4.1.0.SNAPSHOT > [22]]____ > > > org.osgi.framework.BundleEvent[source=org.apache.karaf.jaas.modules_4.1.0.SNAPSHOT > [21]]____ > > > org.osgi.framework.BundleEvent[source=org.apache.karaf.jaas.modules_4.1.0.SNAPSHOT > [21]]____ > > > org.osgi.framework.BundleEvent[source=org.apache.karaf.jaas.config_4.1.0.SNAPSHOT > [20]]____ > > > org.osgi.framework.BundleEvent[source=org.apache.karaf.jaas.config_4.1.0.SNAPSHOT > [20]]____ > > > org.osgi.framework.BundleEvent[source=org.apache.karaf.jaas.command_4.1.0.SNAPSHOT > [19]]____ > > > org.osgi.framework.BundleEvent[source=org.apache.karaf.jaas.command_4.1.0.SNAPSHOT > [19]]____ > > > org.osgi.framework.BundleEvent[source=org.apache.karaf.instance.core_4.1.0.SNAPSHOT > [18]]____ > > > org.osgi.framework.BundleEvent[source=org.apache.karaf.instance.core_4.1.0.SNAPSHOT > [18]]____ > > > org.osgi.framework.BundleEvent[source=org.apache.karaf.features.command_4.1.0.SNAPSHOT > [17]]____ > > > org.osgi.framework.BundleEvent[source=org.apache.karaf.features.command_4.1.0.SNAPSHOT > [17]]____ > > > org.osgi.framework.BundleEvent[source=org.apache.karaf.diagnostic.core_4.1.0.SNAPSHOT > [16]]____ > > > org.osgi.framework.BundleEvent[source=org.apache.karaf.diagnostic.core_4.1.0.SNAPSHOT > [16]]____ > > > org.osgi.framework.BundleEvent[source=org.apache.karaf.config.core_4.1.0.SNAPSHOT > [13]]____ > > > org.osgi.framework.BundleEvent[source=org.apache.karaf.config.core_4.1.0.SNAPSHOT > [13]]____ > > > org.osgi.framework.BundleEvent[source=org.apache.karaf.bundle.core_4.1.0.SNAPSHOT > [12]]____ > > > org.osgi.framework.BundleEvent[source=org.apache.karaf.bundle.core_4.1.0.SNAPSHOT > [12]]____ > > > org.osgi.framework.BundleEvent[source=org.apache.aries.jmx.whiteboard_1.1.5 > [10]]____ > > > org.osgi.framework.BundleEvent[source=org.apache.aries.jmx.whiteboard_1.1.5 > [10]]____ > > > org.osgi.framework.BundleEvent[source=org.apache.aries.jmx.core_1.1.7 > [9]]____ > > > org.osgi.framework.BundleEvent[source=org.apache.aries.jmx.core_1.1.7 > [9]]____ > > > org.osgi.framework.BundleEvent[source=org.apache.aries.jmx.api_1.1.5 > [8]]____ > > > org.osgi.framework.BundleEvent[source=org.apache.aries.jmx.api_1.1.5 > [8]]____ > > > org.osgi.framework.BundleEvent[source=org.apache.karaf.deployer.features_4.1.0.SNAPSHOT > [14]]____ > > > org.osgi.framework.BundleEvent[source=org.apache.karaf.deployer.features_4.1.0.SNAPSHOT > [14]]____ > > > org.osgi.framework.BundleEvent[source=org.apache.karaf.deployer.kar_4.1.0.SNAPSHOT > [15]]____ > > > org.osgi.framework.BundleEvent[source=org.apache.karaf.deployer.kar_4.1.0.SNAPSHOT > [15]]____ > > org.osgi.framework.BundleEvent[source=org.apache.aries.util_1.1.3 > [11]]____ > > org.osgi.framework.BundleEvent[source=org.apache.aries.util_1.1.3 > [11]]____ > > > org.osgi.framework.BundleEvent[source=org.apache.karaf.features.core_4.1.0.SNAPSHOT > [7]]____ > > > org.osgi.framework.BundleEvent[source=org.apache.karaf.features.core_4.1.0.SNAPSHOT > [7]]____ > > > org.osgi.framework.BundleEvent[source=org.apache.felix.fileinstall_3.5.6 > [6]]____ > > > org.osgi.framework.BundleEvent[source=org.apache.felix.fileinstall_3.5.6 > [6]]____ > > > org.osgi.framework.BundleEvent[source=org.apache.felix.configadmin_1.8.12 > [5]]____ > > > org.osgi.framework.BundleEvent[source=org.apache.felix.configadmin_1.8.12 > [5]]____ > > > org.osgi.framework.BundleEvent[source=org.ops4j.pax.logging.pax-logging-log4j2_1.9.1 > [4]]____ > > > org.osgi.framework.BundleEvent[source=org.ops4j.pax.logging.pax-logging-log4j2_1.9.1 > [4]]____ > > > org.osgi.framework.BundleEvent[source=org.ops4j.pax.logging.pax-logging-api_1.9.1 > [3]]____ > > > org.osgi.framework.BundleEvent[source=org.ops4j.pax.logging.pax-logging-api_1.9.1 > [3]]____ > > org.osgi.framework.BundleEvent[source=org.ops4j.pax.url.mvn_2.5.1 > [2]]____ > > org.osgi.framework.BundleEvent[source=org.ops4j.pax.url.mvn_2.5.1 > [2]]____ > > > gnodet•apache-karaf-minimal/target/assembly*(*master*⚡**)*»____ > > ____ > > ____ > > ____ > > ____ > > 2016-11-18 13:29 GMT+01:00 CLEMENT Jean-Philippe > <[email protected] > <mailto:[email protected]>>:____ > > 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:[email protected] > <mailto:[email protected]>] > *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 > <[email protected] > <mailto:[email protected]>>:____ > > 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:[email protected] > <mailto:[email protected]>] > *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 > <[email protected] > <mailto:[email protected]>>:____ > > Is there a way to get a shutdown event?____ > > ____ > > Regards,____ > > JP____ > > ____ > > *De :*CLEMENT Jean-Philippe > [mailto:[email protected] > <mailto:[email protected]>] > *Envoyé :* jeudi 17 novembre 2016 17:03 > *À :* [email protected] <mailto:[email protected]> > *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: [email protected] <mailto:[email protected]> > Web: http://fusesource.com <http://fusesource.com/> > Blog: http://gnodet.blogspot.com/ > <http://gnodet.blogspot.com/>____ > > ____ > > > > ____ > > ____ > > -- ____ > > ------------------------ > Guillaume Nodet > ------------------------____ > > Red Hat, Open Source Integration____ > > ____ > > Email: [email protected] <mailto:[email protected]> > Web: http://fusesource.com <http://fusesource.com/> > Blog: http://gnodet.blogspot.com/ > <http://gnodet.blogspot.com/>____ > > ____ > > > > ____ > > ____ > > -- ____ > > ------------------------ > Guillaume Nodet > ------------------------____ > > Red Hat, Open Source Integration____ > > ____ > > Email: [email protected] <mailto:[email protected]> > Web: http://fusesource.com <http://fusesource.com/> > Blog: http://gnodet.blogspot.com/ > <http://gnodet.blogspot.com/>____ > > ____ > > > > ____ > > ____ > > -- ____ > > ------------------------ > Guillaume Nodet > ------------------------____ > > Red Hat, Open Source Integration____ > > ____ > > Email: [email protected] <mailto:[email protected]> > Web: http://fusesource.com <http://fusesource.com/> > Blog: http://gnodet.blogspot.com/ > <http://gnodet.blogspot.com/>____ > > ____ > > > > ____ > > ____ > > -- ____ > > ------------------------ > Guillaume Nodet > ------------------------____ > > Red Hat, Open Source Integration____ > > ____ > > Email: [email protected] <mailto:[email protected]> > Web: http://fusesource.com <http://fusesource.com/> > Blog: http://gnodet.blogspot.com/ > <http://gnodet.blogspot.com/>____ > > ____ > > > > ____ > > __ __ > > -- ____ > > ------------------------ > Guillaume Nodet > ------------------------____ > > Red Hat, Open Source Integration____ > > __ __ > > Email: [email protected] <mailto:[email protected]> > Web: http://fusesource.com <http://fusesource.com/> > Blog: http://gnodet.blogspot.com/ > <http://gnodet.blogspot.com/>____ > > __ __ > > > > > -- > ------------------------ > Guillaume Nodet > ------------------------ > Red Hat, Open Source Integration > > Email: [email protected] <mailto:[email protected]> > Web: http://fusesource.com <http://fusesource.com/> > Blog: http://gnodet.blogspot.com/ > -- Jean-Baptiste Onofré [email protected] http://blog.nanthrax.net Talend - http://www.talend.com
