我在一个使用Apache Felix OSGi实现的应用程序中安装了许多OSGi包。其中一些捆绑包在卸载时需要运行额外的步骤。例如,删除临时文件或删除数据库中的相关行或其他日志记录。业务规则期望在卸载插件时发生这种情况,而不是在插件停止时发生。
我知道BundleActivator上的启动和停止方法,但我无法弄清楚我可以在哪里实现卸载方法。
我也尝试过实现BundleListener。这似乎是在启动时调用,而不是用于卸载。我在BundleActivator的start方法中注册了我的BundleListener。我应该在其他地方注册吗?
实现使用Apache Felix卸载OSGi包时运行的代码的正确方法是什么?
答案 0 :(得分:3)
bundle无法观察它自己的UNINSTALLED事件,因为在bundle stop期间删除了BundleListeners。您需要另一个未停止的捆绑包来观察UNINSTALLED事件并执行任何所需的处理。
答案 1 :(得分:2)
正如其他人所说,我不认为你可以在捆绑本身中做到这一点。您可能需要使用另一个捆绑包。
在另一个捆绑中你可以例如注册声明性服务(例如使用 Apache Felix SCR 注释)并使用BundleTracker
/ BundleTrackerCustomizer
来监听添加和删除的包。