19

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

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

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

谢谢

4

4 回答 4

23

请不要使用 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 ) 免费获得。

于 2009-12-17T01:46:42.217 回答
8

我通常像这样终止框架:

bundlecontext.getBundle(0).stop();

id = 0 的包是系统包

于 2013-04-18T12:01:21.717 回答
4

我还在应用程序嵌入式上下文中使用 Equinox,并在 System Bundle 上调用 stop(),然后使用 EclipseStarter.shutdown() 跟进。您可能必须停止所有捆绑包。

我从来没有真正关心过我的应用程序中的捆绑关闭,因为没有保留状态。

于 2009-12-16T19:15:47.330 回答
-1

目前还没有标准的方法来做到这一点。OSGI 将在下一个版本中将其作为标准 api 的一部分,但我认为所有 OSGI 容器都需要一段时间才能实现这一点。现在使用容器特定的代码,但远离 System.exit()。

问候,

莱恩·托伦

于 2010-02-09T10:39:14.633 回答