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