gpt4 book ai didi

java - 如何等待另一个捆绑?

转载 作者:行者123 更新时间:2023-11-29 05:40:07 25 4
gpt4 key购买 nike

我正在开发一个由多个包组成的 OSGi 应用程序。所有这些都依赖于 EventAdmin 之一。但是,一个特定的插件必须在捆绑启动后立即启动计划任务(即在激活器的启动方法中)。问题是事件管理服务还没有注册,我应该等待它的部署。我不想通过配置属性文件来做到这一点,因此,如果没有 Felix 的属性文件,是否有任何操作可以做到这一点?

提前致谢

最佳答案

在 OSGi 中没有启动顺序...克服它...虽然有影响初始启动顺序的机制,但问题是任何 bundle 都可能随时停止。因此,唯一的解决方案是实际处理您对 Event Admin 的依赖。

对于声明式服务 (DS),这实际上是一项非常小的工作。另外,请忘记 bundle 激活器,它们是 bundle 单例,因此不是一个好主意。因此,在 DS 中,您将执行以下操作(使用注释):

@Component(immediate=true)
public class MyTask extends Thread {
EventAdmin ea;


public void run() {
while ( !isInterrupted()) {
// do something
ea.postEvent(...);
}
}

@Activate void activate() { this.start();}
@Deactivate void deactivate() { this.interrupt(); }
@Reference void setEventAdmin(EventAdmin ea) { this.ea = ea;}
}

在极少数情况下,您不应该使用 DS 而受困于 Bundle-Activators,但这种情况很少见,而且应该会越来越少。如果您遇到这样一个非常糟糕的情况,那么您还可以在 Bundle Activator 启动方法中创建一个服务跟踪器并跟踪 Event Admin 服务。一旦你得到一个,你就创建一个线程来运行你的代码。当服务消失时,您会中断线程。然而,这是一个复杂得多的解决方案。

还有其他服务依赖管理器,但我强烈推荐带有注释的声明式服务。

关于java - 如何等待另一个捆绑?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17918871/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com