我正在开发一个由几个包组成的OSGi应用程序。所有这些都依赖于EventAdmin。但是,一旦启动捆绑(即,在激活器的启动方法中),一个特定插件必须启动计划任务。问题是事件管理服务仍未注册,我应该等待部署。我不想通过配置属性文件执行此操作,因此,如果没有Felix的属性文件,是否有任何操作?
提前多多感谢
答案 0 :(得分:3)
OSGi中没有开始排序...克服它...虽然有影响初始启动排序的机制,但问题是任何捆绑都可以随时停止。因此,唯一的解决方案是实际处理您对事件管理员的依赖。
使用声明服务(DS),这实际上是非常少的工作。此外,请忘记捆绑激活器,他们是捆绑单身,因此是一个坏主意。因此,在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服务。获得一个后,您将创建一个运行代码的线程。当服务消失时,您将中断线程。但是,这是一个更复杂的解决方案。
还有其他服务依赖项管理器,但我强烈建议使用带注释的声明式服务。
答案 1 :(得分:0)
我已经使用iPOJO了。它被设计用于felix& karaf。该库了解组件的生命周期和依赖关系,当组件依赖关系可用或一个或多个消失时,将通过@Validate和@Invalidate方法通知您。
当服务(接口)的实现出现或消失时,它还支持@Bind和@Unbind。这使订阅更加简单。
你有一个服务的监听器,这个组件@Provides一个要调用的接口。然后,当出现这样的组件时,中心事件寄存器将在其@Bind方法上被调用;当它因任何原因消失时,它将被@Unbind调用。
我怀疑iPOJO应该完成你需要的所有依赖管理和绑定。