我正在寻找关闭 OSGi 容器的最佳实践。
目前我们正在使用一个小型启动器应用程序,它调用 EclipseStarter.startup() 并安装一些核心包。之后,启动器终止。
当测试 GUI(作为包运行)关闭时,它会调用 System.exit(0) 来关闭容器,但必须有比这更优雅的解决方案。
谢谢
请不要使用 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 ) 免费获得。
我通常像这样终止框架:
bundlecontext.getBundle(0).stop();
id = 0 的包是系统包
我还在应用程序嵌入式上下文中使用 Equinox,并在 System Bundle 上调用 stop(),然后使用 EclipseStarter.shutdown() 跟进。您可能必须停止所有捆绑包。
我从来没有真正关心过我的应用程序中的捆绑关闭,因为没有保留状态。
目前还没有标准的方法来做到这一点。OSGI 将在下一个版本中将其作为标准 api 的一部分,但我认为所有 OSGI 容器都需要一段时间才能实现这一点。现在使用容器特定的代码,但远离 System.exit()。
问候,
莱恩·托伦