java - 如何在 OSGi 框架停止之前销毁所有 OSGi 蓝图组件?
问题描述
如果我停止 OSGi 框架,OSGi 蓝图组件不会被销毁(不会调用销毁方法)。为什么会这样,我该如何摧毁它们。我有自己的 OSGi 启动器实现。我正在使用关闭挂钩,然后停止 OSGi 框架:
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
Launcher.logService.log(LogService.LOG_WARNING, "HANDLE SHUTDOWN");
if(Launcher.framework != null) {
try {
Launcher.framework.stop();
} catch (BundleException e) {
Launcher.logService.log(LogService.LOG_ERROR, "Shutdown" + ((Launcher.framework != null) ? " of " + Launcher.framework.getSymbolicName() + " " : " ") + "failed!", e);
System.exit(-1);
}
}
}
});
解决方案
我们应该等待框架停止。
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
Launcher.logService.log(LogService.LOG_WARNING, "HANDLE SHUTDOWN");
if(Launcher.framework != null) {
try {
Launcher.framework.stop();
Launcher.framework.waitForStop(0); // !!!
} catch (BundleException e) {
Launcher.logService.log(LogService.LOG_ERROR, "Shutdown" + ((Launcher.framework != null) ? " of " + Launcher.framework.getSymbolicName() + " " : " ") + "failed!", e);
System.exit(-1);
}
}
}
});
推荐阅读
- apache - Httpd 服务未在 Alpine docker 映像中启动
- xml - 使用命名空间将 xslt 应用于 xml
- jakarta-mail - JavaMail:为 SSL 使用自定义 SSLSocketFactory
- python - 如何获得python执行的shell命令的最终输出
- python - 使用字符串值将分类行转换为列标题(无聚合)
- c# - .net + 使用 redissessionstateprovider + sessionstate 自定义模式在多个服务器上共享会话
- c - 为什么我的线程合并排序比基本递归合并排序慢?
- angular - 单击 routerLink 时,Angular 不会重新加载组件
- php - 为什么在 PHP 中禁用 E_WARNING 被认为是不好的做法?
- c++ - 在c ++中迭代包含指针的向量