0

我遇到了以下情况:服务器正在等待一个或多个函数。当一个函数被绑定时,就会调用 bindFunction。它需要调用任何SpecificSystem 的doSomething()。

当我的 OSGi 容器中没有 SpecificSystem 时,什么都不会发生,这很好,因为系统引用不满足。当我将特定系统添加到我的容器时会出现问题。在这种情况下,在设置系统引用之前调用 bindFunction 会导致 bindFunction 内部出现 NullPointerException。

是否有任何 OSGi 方式来确保在执行 bindFunction 时设置了系统引用,以便我可以在 bindFunction 中安全地调用 system.doSomething()?

4

3 回答 3

1

你在这里踩在危险的水里:-) 你需要订购。您的代码假定在bindFunction引用之后调用system引用。

OSGi 规范保证注入按照引用名称的词法顺序进行。(当然,这仅适用于可用服务。)

便宜的方法是命名您的引用,以便system引用的名称在词汇上低于引用的名称bindFunction,例如asystemor _system。注入按词汇顺序进行。

当然,这很丑陋。处理这种情况的一种方法是注入 Function 服务并在需要时使用它们,而不是在绑定函数中主动执行某些操作。这使事情变得更加懒惰,这几乎总是好的。

于 2020-02-25T10:48:27.593 回答
0

在您的示例中,系统引用似乎是强制性的。在这种情况下,只有存在系统服务时,您的服务器组件才会出现。

于 2020-02-25T10:30:39.860 回答
0
import org.osgi.service.component.annotations.Activate;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;
import org.osgi.service.component.annotations.ReferenceCardinality;

@Component(name = "ServerComponent", immediate = false)
public class Server {

    @Reference(cardinality = ReferenceCardinality.MANDATORY)
    System system;

    @Reference(cardinality = ReferenceCardinality.MANDATORY)
    protected void bindFunction(Function func) {

    }

    @Activate
    public void activate() {

    }   
}

您可以在激活方法中调用 doSomething()。Osgi 使用@Reference 注解保证方法调用顺序。

如果获取系统和函数引用,则激活方法将被 OSGi 环境调用。您可以在 activate() 方法中调用 system.doSomething() 方法。@Reference(cardinality = ReferenceCardinality.MANDATORY) 注解表示在获取到引用后调用activate方法。

于 2020-02-26T16:44:22.660 回答