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 <
jean-philippe.clem...@fr.thalesgroup.com>:

> 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:gno...@apache.org]
> *Envoyé :* vendredi 18 novembre 2016 16:40
>
> *À :* user
> *Objet :* Re: Karaf shutdown
>
>
>
>
>
>
>
> 2016-11-18 15:01 GMT+01:00 CLEMENT Jean-Philippe <
> jean-philippe.clem...@fr.thalesgroup.com>:
>
> 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()> ($.context bundle 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:gno...@apache.org]
> *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()> ($.context bundle 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 <
> jean-philippe.clem...@fr.thalesgroup.com>:
>
> 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>:
>
> 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]
> *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>:
>
> Is there a way to get a shutdown event?
>
>
>
> Regards,
>
> JP
>
>
>
> *De :* CLEMENT Jean-Philippe [mailto:jean-philippe.clement@
> fr.thalesgroup.com]
> *Envoyé :* jeudi 17 novembre 2016 17:03
> *À :* 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
> Web: http://fusesource.com
> Blog: http://gnodet.blogspot.com/
>
>
>
>
>
>
>
> --
>
> ------------------------
> Guillaume Nodet
> ------------------------
>
> Red Hat, Open Source Integration
>
>
>
> Email: gno...@redhat.com
> Web: http://fusesource.com
> Blog: http://gnodet.blogspot.com/
>
>
>
>
>
>
>
> --
>
> ------------------------
> Guillaume Nodet
> ------------------------
>
> Red Hat, Open Source Integration
>
>
>
> Email: gno...@redhat.com
> Web: http://fusesource.com
> Blog: http://gnodet.blogspot.com/
>
>
>
>
>
>
>
> --
>
> ------------------------
> Guillaume Nodet
> ------------------------
>
> Red Hat, Open Source Integration
>
>
>
> Email: gno...@redhat.com
> Web: http://fusesource.com
> Blog: http://gnodet.blogspot.com/
>
>
>



-- 
------------------------
Guillaume Nodet
------------------------
Red Hat, Open Source Integration

Email: gno...@redhat.com
Web: http://fusesource.com
Blog: http://gnodet.blogspot.com/

Reply via email to