Equinox开始通知

时间:2014-01-30 09:05:47

标签: eclipse osgi equinox

化背景

我在Eclipse IDE中使用Equinox来运行一组bundle(其中一些是我的Eclipse工作集中的项目)。

启动Equinox之后,我想运行一些服务。一种选择是使用可以正常工作的控制台,但是,我想在点击“运行”按钮后自动运行 ,而不是每次都在控制台窗口中再次编写命令。

我想要运行的服务的另一个特殊之处是它消耗了另一个只能在运行时解析的服务。在运行期间,我的应用程序会检查谁可以提供某些服务并在服务提供商之间进行选择。这意味着:

  • 我可以在安装并启动所有软件包之后运行我的应用程序。
  • 我无法事先知道(在编译时)我的应用程序所依赖的捆绑包。根据运行时参数选择服务提供商。

我的问题是:

有没有办法注册一些通知,以便了解Equinox在启动时何时完成安装和启动所有捆绑包?

如果有这样的钩子,我可以用它来知道我何时可以开始申请。

2 个答案:

答案 0 :(得分:0)

我认为在尝试在应用程序中构建可扩展性时,这是OSGi中一个非常常见的问题。让我们看看我是否理解正确。

您有一个服务界面,用于为您的捆绑提供某种扩展。您的捆绑包应在所有扩展程序加载后运行。

所以问题是你不知道所有捆绑包都出现了。顺便说一句。如果提供服务的捆绑包使用例如蓝图然后他们的包可以是活动的,而蓝图扩展器还没有运行。因此,可能没有解决方案可以确定所有捆绑包何时完全启动。

所以在这种环境中有两种可能的解决方案:

  1. 您的捆绑包开始使用现有服务并侦听其他服务并完成集成这些服务的必要工作
  2. 您可以在配置中描述哪些扩展应该存在。在这种情况下,每个扩展可以使用服务属性中的唯一名称注册其服务。然后,您可以在捆绑包的配置中定义在捆绑包真正开始之前需要存在哪些名称。
  3. 案例2用于例如CXF DOSGi中。服务端点可以指定它需要的名称“意图”。然后,只有当所有意图以具有这些名称的服务形式出现时,才会发布服务端点。例如,如果您有安全服务,并且您的捆绑包可能无法在没有安全服务的情况下启动,那么这种情况就很有用,因为它不安全。

    除了这两个变种之外,我不知道任何可靠的机制。

答案 1 :(得分:0)

找到它。

通过调用Framework Event在Bundle的激活器上注册context.addFrameworkListener,并在STARTED事件被触发时启动应用程序。

运行良好,我只是想知道是否需要在新线程上启动应用程序,或者我可以直接从事件处理程序启动我的应用程序。