使用配置属性选择DS组件的依赖关系

时间:2017-02-14 12:22:39

标签: java osgi declarative-services

考虑这种情况:

  • 在完全基于OSGi并且大量使用服务层SOA概念的网络管理系统中,它决定将NE管理模块转换为DS组件。
  • 配置子代理的角色中有一个DS组件,用于跟踪网络资源,当时机成熟时,它会根据Neil's article的工厂配置将管理组件配置为通过工厂配置来管理该资源。
  • 组件集未知,但其配置工厂PID由安装管理组件的专用软件包发布。
  • 假设某些管理组件之间存在静态不情愿强制依赖关系,例如C2需要{ {1}}。由于NMS正在处理许多资源,因此可能存在许多C1C1的实例。因此,C2必须绑定到其匹配的C2
  • 此选择的条件是一个密钥,例如C1,它由配置代理按资源生成,并通过其(工厂)配置属性提供给每个组件。

现在,我的问题是:

问题:由于配置属性仅在组件激活后可用,因此resource-key如何在激活之前绑定到正确的C2,因为他们的关系?

我知道这个问题有不同的风格,并且有一些诙谐的答案,如Dynamic target queries in OSGi with DShere。但是,所有这些答案中缺少的是这样的事实:在某些情况下,组件的每个实例的动态配置都不是先验已知,或者至少在激活之前不会。

提案: 由于我们必须解决这个问题,我能想到的唯一优雅 OSGi可接受的答案是在引用绑定时引入动态宏扩展允许C1

这样的内容
C2

我们暂时选择坚持使用 Equinox DS (是的,我知道!)因此,我修补了他们的SCR,现在@Reference(target="(resource-key=${resource-key})") protected void bindC1(C1 c1) { // some binding code } 将绑定到通过使用C2&#扩展 C1 ,将resource-key的{​​{1}}属性与C2属性匹配的正确实例39;自己的配置。 ${resource-key-value}内无法访问此值。

我想知道为什么我测试的所有SCR都缺少这样一个方便的设施。我在这里演示的内容可以扩展为使用除组件配置属性之外的各种来源。但为什么至少没有证据表明有关此类功能的正式提案?请赐教!

1 个答案:

答案 0 :(得分:1)

我没有看到你需要这样的功能。由于您通过组件属性提供resource-key,为什么不提供C1引用的目标属性C1.target(参见DS规范中的112.6.2.1),它引用资源键值相同方式是什么?

C1.target = (resource-key=xxx)

C1.target组件属性的值将覆盖target参考注释中的C1信息。

确定值[{1}}比(resource-key=xxx)稍微复杂一点,但这比某些宏扩展功能要容易得多。