Java OSGi DS:为什么在激活之前调用setService

Java OSGi DS:为什么在激活之前调用setService,java,osgi,Java,Osgi,我有一个定义了属性的OSGiDS组件,它引用了另一个bundles服务。在setService方法中,我获取另一个bundle服务的引用并启动另一个线程。我依赖于component.xml中定义的属性。因此,我第一次能够从component.xml文件中读取属性是在bundle获得调用的激活的方法并获得组件上下文的引用之后。现在我似乎遇到了严重的计时问题,因为setService是在activate执行之前执行的 这怎么可能?捆绑包如何在激活之前获得所需的服务引用 在setService方法中

我有一个定义了属性的OSGiDS组件,它引用了另一个bundles服务。在
setService
方法中,我获取另一个bundle服务的引用并启动另一个线程。我依赖于
component.xml
中定义的属性。因此,我第一次能够从component.xml文件中读取属性是在bundle获得调用的
激活的
方法并获得
组件上下文的引用之后。现在我似乎遇到了严重的计时问题,因为
setService
是在
activate
执行之前执行的

  • 这怎么可能?捆绑包如何在激活之前获得所需的服务引用
  • 在setService方法中启动线程时,如何访问component.xml中定义的属性
具体例子如下:

private String publishingUrl = "http://0.0.0.0:11023/ws"; // default address

protected synchronized void activate(ComponentContext context) {
    this.ctx = context;
    if (ctx != null) {
        String url = String.valueOf(ctx.getProperties().get("publishingUrl"));
        if (url != null) publishingUrl = url;
    }
    logger.info("Activated and got the publishingUrl: "+ publishingUrl);
}

public void setService(AnotherService service) {
    synchronized (this) {
        if (this.anotherService == service) {
            logger.info("anotherService was already set.");
            return;
        } else {
            this.anotherService = service;
            logger.info("Got anotherService. Thank you DS!");
        }
    }
    startWebserviceThread(publishingUrl);
}
在控制台输出中,我看到来自
设置服务
,然后来自
激活
的记录器消息。始终使用默认值
publishingUrl
调用方法
startWebserviceThread
,而不是使用从ComponentContext属性文件获取的值

另外,如果我在component.xml中设置
immediate=“true”
immediate=“false”
,也没有什么区别

运行时:Java1.6,EclipseEquinox

使用
setService()
方法将依赖项注入DS。 然后调用
activate()
,工作线程应该从这里开始

您必须移动
startWebService线程(publishingUrl)
;在
activate()
方法的末尾

这也是你的逻辑所暗示的。您可以从上下文中获取发布url设置,然后启动web服务。要使用另一个服务,您需要在启动之前对其进行引用,因此在
activate()
之前调用
setService()


如中所述,不应在set/unset方法中使用服务。

好的,看来我对执行顺序有了另一种理解。在我看来,activate方法应该是以任何方式调用的第一个方法,然后对设置/取消设置依赖服务作出反应。但是你的解释完全有道理(当然它是按照你的建议工作的)。你没有提到,但我假设你对另一个服务的引用是静态策略引用。静态策略引用总是在调用activate方法之前注入。调用activate方法后,可以注入动态策略引用。