【问题标题】:Kura How to communicate between bundles?Kura 如何在bundle之间进行通信?
【发布时间】:2018-09-26 23:37:15
【问题描述】:

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

非常感谢您的帮助。

【问题讨论】:

    标签: java osgi osgi-bundle kura


    【解决方案1】:

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

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

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

    实现 OSGi 服务的最简单方法是使用称为声明式服务的注入框架。这允许您编写一个简单的 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 规范的示例

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-04-20
      • 2012-02-16
      • 2010-12-12
      • 2013-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多