我一直在尝试在Karaf上使用OSGi声明式服务(例如Blueprint)等示例。我现在要解决的问题是如何在运行时获取对某些服务的引用(因此,注释和/或XML并不是真正的选择)
我将解释我的用例:
我正在尝试设计(到目前为止,仅在我脑海中,这就是为什么我仍仅在OSGi上进行实验的原因:))用于控制工业中某些自动化过程的系统。为了与设备通信,正在使用一组特殊的协议(protocol)。为了使组件尽可能地可重用,我设计了基于层的通信模型(例如用于网络的ISO / OSI模型,但更为简单)
为了将其转换为OSGi,我系统的每一层都将由一组 bundle 软件组成。一个用于该层的接口(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/