【问题标题】:How to handle different @Reference in OSGi DS Component如何在 OSGi DS 组件中处理不同的 @Reference
【发布时间】:2020-06-08 23:57:09
【问题描述】:

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

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

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

【问题讨论】:

    标签: osgi osgi-ds


    【解决方案1】:

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

    【讨论】:

    • 没错,但不是问题所在。我的问题是服务器组件出现了,但是当有一个函数“等待”时,它会在设置系统引用之前触发 bindFunction 被调用。有什么方法可以确保当我的服务器启动时,在为所有“等待”函数调用 bindFunction 之前设置系统引用?
    • DS 似乎按字母顺序初始化。所以尝试将服务器命名为 aserver,它可能已经工作了。
    【解决方案2】:

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

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

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

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

    【讨论】:

    • 系统的构造函数注入在这里有帮助吗?
    • @PeterKriens 谢谢,知道这两个选项已经有帮助了!
    【解决方案3】:
    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方法。

    【讨论】:

      猜你喜欢
      • 2016-05-15
      • 2021-04-03
      • 2023-04-02
      • 1970-01-01
      • 2010-09-27
      相关资源
      最近更新 更多