【问题标题】:How can I implement an uninstall method for an OSGi bundle under Apache Felix?如何在 Apache Felix 下为 OSGi 包实现卸载方法?
【发布时间】:2014-11-10 17:47:42
【问题描述】:

我在使用 Apache Felix OSGi 实现的应用程序中安装了许多 OSGi 包。其中一些捆绑包在卸载时需要运行额外的步骤。例如删除临时文件或删除数据库中的相关行或其他日志记录。业务规则希望在卸载插件时发生这种情况,而不是在停止时发生。

我知道 BundleActivator 上的启动和停止方法,但我不知道在哪里可以实现卸载方法。

我也尝试过实现一个 BundleListener。这似乎是在启动时调用的,但不是在卸载时调用的。我在我的 BundleActivator 的启动方法中注册我的 BundleListener。我应该在其他地方注册吗?

在使用 Apache Felix 卸载 OSGi 包时,实现代码运行的正确方法是什么?

【问题讨论】:

  • 这个资源提供了我能想到的每一个可能的搜索词:eclipsesource.com/blogs/2013/01/23/… 它似乎捕捉到了卸载事件,但我的代码没有。 ServiceListener 也有几个 Apache Felix 示例,但 BundleListener 没有。
  • 是的,该博客提到了可以提供帮助的 BundleWatcher 接口,但您的问题是特定于 Felix 实现的。

标签: java osgi apache-felix osgi-bundle


【解决方案1】:

bundle 无法观察到它自己的 UNINSTALLED 事件,因为它的 BundleListener 在 bundle 停止期间被删除。您将需要另一个未停止的包来观察 UNINSTALLED 事件并执行任何所需的处理。

【讨论】:

  • 我接受了这个答案,因为它是我使用的实现。我有一个针对“根激活器”BundleContext 注册的 BundleListener,然后它能够​​监听我所有 OSGI 插件的事件。侦听器负责决定它是否是需要对其进行操作的插件类型。这行得通,但有点尴尬。我喜欢下面@Puce 的方法,如果时间允许,我将使用 BundleTracker 重新实现。
  • BundleTracker 是更好的 BundleListener。但基本答案是一样的:一个包不能处理它自己的 UNINSTALLED 事件。您需要让另一个(活动)捆绑包进行任何所需的处理。
【解决方案2】:

正如其他人所说,我认为您不能在捆绑包本身中执行此操作。您可能必须为此使用另一个捆绑包。

在其他捆绑包中,您可以例如注册一个声明式服务(例如,使用 Apache Felix SCR 注释)并使用 BundleTracker/ BundleTrackerCustomizer 来监听添加和删除的包。

【讨论】:

  • 我正在查看 BundleTracker 的文档,似乎只有在捆绑进入或离开活动状态时才会调用它。它是否处理进入卸载状态?
  • AFAIK,构造函数采用 stateMask,可能的状态有:UNINSTALLED,INSTALLED, RESOLVED,STARTING,STOPPING,ACTIVE
  • 是的。凉爽的。 osgi.org/javadoc/r4v42/org/osgi/util/tracker/…, int, org.osgi.util.tracker.BundleTrackerCustomizer)
  • 如上所述,我更喜欢这个解决方案,即使我找到了一个使用BundleListener 而不是BundleTracker 的实现
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-05-14
  • 2014-05-17
  • 2020-07-29
  • 2014-12-19
  • 2014-08-16
  • 1970-01-01
  • 2014-12-05
相关资源
最近更新 更多