Java 如何在ApacheFelix下实现OSGi捆绑包的卸载方法?

Java 如何在ApacheFelix下实现OSGi捆绑包的卸载方法?,java,osgi,apache-felix,osgi-bundle,Java,Osgi,Apache Felix,Osgi Bundle,我在使用ApacheFelixOSGi实现的应用程序中安装了许多OSGi捆绑包。其中一些捆绑包在卸载时需要运行额外的步骤。例如,删除临时文件或删除数据库中的相关行或附加日志记录。业务规则期望在卸载插件时发生这种情况,而不是在插件停止时发生 我知道BundleActivator上的start和stop方法,但我不知道在哪里可以实现卸载方法 我还尝试了实现BundleListener。这似乎是启动时调用的,但不是卸载时调用的。我正在BundleActivator的start方法中注册BundleLi

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

我知道BundleActivator上的start和stop方法,但我不知道在哪里可以实现卸载方法

我还尝试了实现BundleListener。这似乎是启动时调用的,但不是卸载时调用的。我正在BundleActivator的start方法中注册BundleListener。我应该在别的地方注册吗


使用Apache Felix卸载OSGi捆绑包时运行的代码的正确实现方式是什么?

捆绑包无法观察到自己的卸载事件,因为其捆绑包侦听器在捆绑包停止期间被删除。您需要另一个未停止的bundle来观察卸载事件并执行任何所需的处理。

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


在另一个捆绑包中,您可以注册声明性服务(例如,使用ApacheFelixSCR注释)并使用
BundleTracker
/
BundleTrackerCustomizer
侦听添加和删除的捆绑包。

此资源提供了我能想到的所有可能的搜索词:它似乎捕捉到卸载事件,但我的代码没有。ServiceListener也有几个Apache Felix示例,但BundleListener没有。是的,该博客提到了BundleWatcher接口,它可以提供帮助,但您的问题是特定于Felix实现的。我正在查看BundleTracker的文档,它似乎只有在bundled进入或离开活动状态时才会被调用。它能处理进入卸载状态的问题吗?好的,构造函数接受一个状态掩码,可能的状态是:卸载、安装、解析、启动、停止、活动是。酷,int,org.osgi.util.tracker.BundleTrackerCustomizer)如上所述,我更喜欢这个解决方案,尽管我发现了一个使用
BundleListener
而不是
BundleTracker
的实现,我接受了这个答案,因为它就是我使用的实现。我有一个BundleListener,它注册在一个“根激活器”BundleContext上,然后它就可以监听我所有OSGI插件的事件。监听器负责决定它是否是需要执行操作的插件类型。这是可行的,但有点尴尬。我喜欢下面@Puce的方法,如果时间允许,我将使用BundleTracker重新实现。BundleTracker是更好的BundleListener。但基本答案是一样的:捆绑包无法处理自己的卸载事件。您需要让另一个(活动)包执行任何所需的处理。