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

时间:2009-12-16 17:53:30

标签: osgi shutdown equinox

我正在寻找关闭OSGi容器的最佳做法。

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

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

由于

4 个答案:

答案 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