我正在寻找关闭OSGi容器的最佳做法。
目前我们正在使用一个小型启动器应用程序,它调用EclipseStarter.startup()并安装一些核心软件包。之后发射器终止。
当测试GUI(作为一个捆绑包运行)关闭时,它会调用System.exit(0)来关闭容器,但必须有一个更优雅的解决方案。
由于
答案 0 :(得分:22)
请不要使用System.exit(0)来关闭OSGi框架。您应该通过使用ID 0(系统捆绑包)停止捆绑包来实现此目的。通过这种方式,您可以为所有捆绑包提供有序关闭的机会(例如,释放资源等)。
OSGi规范定义了以下内容(核心规范,R4.x,4.2.6停止框架)。
可以通过停止系统包,[...]或在框架对象上调用stop方法来启动关闭。
在该章中,详细描述了框架关闭时会发生什么。
系统捆绑包。框架对象也被定义(第4.6章系统包):
系统包在启动框架时类似于框架对象,但实现不需要为框架对象和系统包使用相同的对象。但是,两个对象必须具有包ID 0,相同位置和包符号名称。
OSGi规范可在OSGi Alliance的网站(http://www.osgi.org/Specifications/HomePage)免费获取。
答案 1 :(得分:8)
我通常会像这样终止框架:
bundlecontext.getBundle(0).stop();
id = 0的捆绑包是系统捆绑包
答案 2 :(得分:4)
我还在应用程序嵌入式上下文中使用Equinox,并在System Bundle上调用stop(),然后使用EclipseStarter.shutdown()进行操作。您可能必须停止所有捆绑包。
由于没有保留状态,我从未真正关注应用程序中的捆绑关闭。
答案 3 :(得分:-1)
目前尚无标准的方法。 OSGI将在下一个版本中将其作为标准API的一部分,但我猜想在所有OSGI容器实现之前需要一段时间。现在使用容器特定代码,但远离System.exit()。
此致
Leen Toelen