关闭 OSGi 容器的最佳方法(特别是 Equinox)
Posted
技术标签:
【中文标题】关闭 OSGi 容器的最佳方法(特别是 Equinox)【英文标题】:Best way to shutdown an OSGi Container (specifically equinox) 【发布时间】:2010-12-27 08:23:31 【问题描述】:我正在寻找关闭 OSGi 容器的最佳实践。
目前我们正在使用一个小型启动器应用程序,它调用 EclipseStarter.startup() 并安装一些核心包。之后启动器终止。
当测试 GUI(作为包运行)关闭时,它会调用 System.exit(0) 来关闭容器,但必须有比这更优雅的解决方案。
谢谢
【问题讨论】:
【参考方案1】:请不要使用 System.exit(0) 来关闭 OSGi 框架。您应该通过停止 ID 为 0 的捆绑包(系统捆绑包)来实现它。这样,您就可以让所有捆绑包有机会有序地关闭(例如释放资源等)。
OSGi 规范定义了以下内容(核心规范,R4.x,4.2.6 停止框架)。
可以通过停止系统包、[...] 或在框架对象上调用 stop 方法来启动关闭。
在那一章中详细描述了框架关闭时会发生什么。
系统捆绑包。还定义了框架对象(第 4.6 章系统包):
系统包在启动框架时类似于框架对象,但实现不需要为框架对象和系统包使用相同的对象。但是,这两个对象必须具有捆绑 ID 0、相同的位置和捆绑符号名称。
OSGi 规范可在 OSGi 联盟的网站 (http://www.osgi.org/Specifications/HomePage) 免费获取。
【讨论】:
【参考方案2】:我通常这样终止框架:
bundlecontext.getBundle(0).stop();
id = 0 的包是系统包
【讨论】:
什么是bundleContext
?不要给出具有您的局部变量名称的答案,因为我们这些阅读您的答案的人没有您的代码来知道该变量是什么类型。【参考方案3】:
我还在应用程序嵌入式上下文中使用 Equinox,并在 System Bundle 上调用 stop(),然后使用 EclipseStarter.shutdown() 跟进。您可能必须停止所有捆绑包。
我从来没有真正关心过我的应用程序中的捆绑关闭,因为没有保留状态。
【讨论】:
【参考方案4】:目前还没有标准的方法来做到这一点。 OSGI 将在下一个版本中将其作为标准 api 的一部分,但我认为所有 OSGI 容器都需要一段时间才能实现这一点。现在使用容器特定的代码,但远离 System.exit()。
问候,
莱恩·托伦
【讨论】:
到目前为止的标准方式是我在回答中描述的。这是 OSGi 规范中指定的行为,也在下一个版本 4.2 中。下一个版本(4.2.)将包括可选启动级别服务,可用于控制捆绑包(和框架)的启动级别。以上是关于关闭 OSGi 容器的最佳方法(特别是 Equinox)的主要内容,如果未能解决你的问题,请参考以下文章