0

我正在尝试做一个物联网项目,我需要在其中实现一些 OSGi 服务。问题是这些服务需要在它们之间发送信息。我已经看到这可以通过“bnd”之类的工具来完成,但目前我正在使用 Kura。所以,我想知道用 Kura 做这件事的方法是什么。

非常感谢您的帮助。

4

1 回答 1

0

我已经看到这可以通过“bnd”之类的工具来完成,但目前我正在使用 Kura。

bnd 项目是一个主要用于构建时帮助您为 OSGi 包组装元数据的工具。使用 bnd 来帮助制作你的包,然后在运行时在像 Kura 这样的平台上使用它完全没有问题。

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

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

@Component
public class MyComponent implements SomeService {

    @Override
    public void someServiceMethod() { }

}

上面的组件会自动注册为a 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 项目中有更多使用声明式服务和其他 OSGi 规范的示例

于 2018-09-27T08:47:49.300 回答