关闭OSGi容器(特别是Equinox)的最佳方法

19

我正在寻找一种关闭OSGi容器的最佳实践。

目前,我们使用一个小型启动程序调用EclipseStarter.startup()并安装一些核心bundle。之后,启动程序终止。

测试GUI(作为bundle运行)关闭时调用System.exit(0)来关闭容器,但必须有比这更优雅的解决方案。

谢谢

4个回答

23
请不要使用System.exit(0)来关闭OSGi框架。您应该通过停止ID为0的bundle(即系统bundle)来完成此操作。这样,您可以让所有的bundle有机会以有序的方式关闭(例如释放资源等)。
OSGi规范定义了以下内容(核心规范,R4.x,4.2.6 停止框架):
“关闭可以通过停止系统bundle来启动,[...]或者在framework对象上调用stop方法。”
在该章节中,详细描述了关闭框架时会发生什么。
系统bundle或framework对象也被定义(第4.6章 系统Bundle):
“当框架启动时,系统bundle类似于framework对象,但是实现不需要使用相同的对象作为framework对象和系统bundle。然而,两个对象必须具有相同的bundle ID、位置和bundle符号名称。”
OSGi规范可以在OSGi联盟网站免费获取 (http://www.osgi.org/Specifications/HomePage)。

8

我通常是这样终止框架的:

bundlecontext.getBundle(0).stop();

id为0的bundle是系统bundle。


1
bundleContext是什么?不要给出变量名作为答案,因为阅读你的答案的人没有你的代码无法知道该变量的类型。 - searchengine27

4

我还在应用程序嵌入式环境中使用Equinox,并在系统Bundle上调用stop(),然后跟随EclipseStarter.shutdown()。您可能需要停止所有bundle。

由于没有保留状态,我从未真正担心过应用程序中的bundle关闭。


-1

目前还没有标准的方法来实现这一点。OSGI将在下一个版本中将其作为其标准API的一部分,但我猜在所有OSGI容器实现此功能之前还需要一段时间。现在请使用特定于容器的代码,但要避免使用System.exit()。

敬礼,

Leen Toelen


到目前为止,标准做法是我在答案中描述的。这是在OSGi规范中指定的行为,也适用于下一个版本4.2。下一个版本(4.2)将包括可选的开始级别服务,可用于控制捆绑包(和框架)的启动级别。 - Andreas Kraft

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接