gpt4 book ai didi

java - OSGi DS : Why is setService called before activate

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

我有一个定义了属性的 OSGi DS 组件,它正在引用另一个捆绑服务。在 setService 方法中,我获取了其他捆绑服务的引用并启动了另一个线程。我依赖于 component.xml 中定义的属性。因此,我第一次能够从 component.xml 文件读取属性是在 bundle 调用 activated 方法并获取 ComponentContext 的引用之后。现在看来我有严重的时间问题,因为 setServiceactivate 执行之前执行。

  • 怎么可能? bundle 如何在激活之前获得所需的服务引用?
  • 在 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);
}

在控制台输出中,我看到来自 setService 的记录器消息,然后来自 activatestartWebserviceThread 方法总是使用 publishingUrl 的默认值调用,而不是从 ComponentContext 属性文件中获取的值。

如果我在 component.xml 中设置 immediate="true"immediate="false" 也没有什么区别

运行时:Java 1.6,eclipse equinox

最佳答案

setService() 方法用于将依赖项注入(inject)您的 DS。然后调用activate(),这里是工作线程应该启动的地方。

你必须移动startWebserviceThread(publishingUrl);在 activate() 方法的末尾。

这也是你的逻辑所暗示的。您从您的上下文中获取发布 url 设置,然后您可以启动您的 web 服务。要使用其他服务,您需要在 开始之前引用它,所以这就是为什么在 activate() 之前调用 setService() 的原因。

this tutorial 中所述, 不应在设置/取消设置方法中使用服务。

关于java - OSGi DS : Why is setService called before activate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21183323/

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