service - OSGi 声明式服务在运行时过滤引用

标签 service runtime osgi karaf

我一直在尝试在 Karaf 上使用 OSGi 声明式服务(除其他事项外,例如蓝图)的一些示例。我现在要解决的问题是如何在运行时获取对某些服务的引用(因此注释和/或 XML 在这里并不是真正的选择)

我将解释我的用例:

我正在尝试设计(到目前为止只是在我的脑海中,这就是为什么我仍然只试验 OSGi :) )一个系统来控制工业中的某些自动化过程。为了与设备通信,使用了一组特殊的协议(protocol)。为了使组件尽可能可重用,我设计了一个基于层的通信模型(例如用于网络的 ISO/OSI 模型,但要简单得多)

为了将其转换为 OSGi,我系统的每一层都将由一组包组成。一个用于该层的接口(interface),然后一个插件用于该层的每个实现(将其想象为 OSI 传输层上的 TCP 与 UDP)。

要引用此类网络中的任何设备,将使用自定义地址格式(此类地址的两个示例可以是 xpa://12.5/03FE 或 xpb://12.5/03FE)。此类地址包含有关层的所有信息及其访问所请求设备所需的值。您可以猜到,该地址的每个部分代表我的网络模型的一层。

这些地址将存储在一些配置数据库中(因此,同样,简单的 .cfg 或 .properties 文件不是一个选项)以便它们可以在运行时远程更改。

我正在考虑创建一个工厂,它将解析该地址,并根据其所有组件创建一个对象链(从 OSGi 获取适当的服务),以实现所有层并相应地配置它们。

由于单个层可以有更多实现(因此,更多服务实现单个接口(interface)),该工厂需要在运行时(当它获取作为字符串传递的设备地址时)决定选择哪个特定实现(根据服务将声明的其他属性)。

这如何在 OSGi 中实现?哪种方法对此更好,DS、Blueprint 还是其他?

最佳答案

我意识到现在这个问题的答案已经很晚了,但是这两个答案都忽略了声明式服务中对过滤的明显内置支持。

可以使用@Reference 注释为 DS 引用定义目标过滤器:

@Component
public class ExampleComponent {
    @Reference(target="(foo=bar)")
    MyService myService;
}

这个目标过滤器也可以使用配置来添加(或覆盖)。对于组件:

@Component(configurationPid="fizz.buzz")
public class ExampleComponent {
    @Reference
    MyService myService;
}

然后,pid fizz.buzz 的配置字典可以使用键 myService.target 设置新过滤器。

这是比跳转到原始 OSGi API 更好的选择,并且已用于多个规范版本。

关于service - OSGi 声明式服务在运行时过滤引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21166070/

相关文章:

selenium - 当我们使用 Jenkins windows 服务模式执行 selenium 脚本时,从渲染器 : 600. 000 接收消息超时

java - 我的代码编译时出现错误,但在运行时执行良好

java - 用于检查已使用文件的 Windows 工具(通过 Java OSGi 进程)

android - Content Provider 是我的应用程序的一部分?

asp.net - 授予网络服务帐户对 ASP.NET Web 应用程序的读/写权限有什么危险?

c++ - 为什么书上说 “the compiler allocates space for variables in memory” ?

arrays - Fortran 运行时错误 : Index '645778864' of dimension 1 of array 'tstar' above upper bound of 24

java - 在指定端口注册Servlet

java - 使用 netbeans 7.1 自动开发 osgi 包

Android绑定(bind)服务和AIDL服务