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]]
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/
--
------------------------
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/