如何等待另一个捆绑?

时间:2013-07-29 08:04:29

标签: java osgi

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

提前多多感谢

2 个答案:

答案 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应该完成你需要的所有依赖管理和绑定。