Kura如何在包之间进行通信?

时间:2018-09-26 23:37:15

标签: java osgi osgi-bundle kura

我正在尝试做一个物联网项目,我需要实现一些OSGi服务。问题在于这些服务需要在它们之间发送信息。我已经知道可以使用“ bnd”之类的工具来完成此操作,但是目前我正在与Kura合作。所以,我想知道用库拉做这件事的方法。

非常感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

  

我已经知道可以使用“ bnd”之类的工具来完成此操作,但目前我正在使用Kura。

bnd项目是一个主要在构建时使用的工具,可帮助您组装OSGi捆绑软件的元数据。使用bnd帮助制作捆绑包,然后在运行时在Kura这样的平台中使用它完全没有问题。

  

我正在尝试做一个物联网项目,我需要实现一些OSGi服务。

实现OSGi服务的最简单方法是使用称为声明性服务的注入框架。这使您可以编写一个简单的POJO,该POJO将在OSGi服务注册表中注册。这就像将@Component添加到类中一样简单:

@Component
public class MyComponent implements SomeService {

    @Override
    public void someServiceMethod() { }

}

上述组件将实现接口,因此将自动注册为SomeService。 Kura平台包括一个声明性服务实现,因此您无需安装其他任何东西。但是,您应该对照Kura支持的版本检查所使用的注释的版本(Kura的3.x使用DS 1.2,4.x使用DS 1.3)。

  

问题在于这些服务需要在它们之间发送信息。

使用DS实现的OSGi服务可以使用@Reference注释以一种非常简洁的方式相互引用。

@Component
public class MyComponent implements SomeService {

    SomeOtherService someOtherService;

    @Reference
    void setSomeOtherService(SomeOtherService sos) {
        someOtherService = sos;
    }

    @Override
    public void someServiceMethod() { 
        someOtherService.doSomethingElse();
    }
}

如果您能够使用DS 1.3,则@Reference批注可以直接应用于字段:

@Component
public class MyComponent implements SomeService {

    @Reference
    SomeOtherService someOtherService;

    @Override
    public void someServiceMethod() { 
        someOtherService.doSomethingElse();
    }
}

OSGi enRoute project

中有更多使用声明式服务和其他OSGi规范的示例。