【问题标题】:Dynamically select a service implementation at runtime using @Reference annotation?使用@Reference 注解在运行时动态选择服务实现?
【发布时间】:2023-03-09 04:35:03
【问题描述】:

我有一个 osgi 实现包,其中包含一个 @Component,它获取一个服务实现的 @Reference。

有多个捆绑包以不同的方式实现服务。没问题 osgi 选择一个(使用排名或类似的东西)。问题在于开发人员(我)决定使用哪个服务实现。

但是是否有可能在运行时(当包启动时或在其他时间)以某种方式指定@Reference 注释应该选择哪个服务实现?

我怀疑我可以使用 ServiceTracker 来执行此操作。

[编辑] 在我发布后我发现https://stackoverflow.com/a/5804265/7820234(策略模式),看起来很有希望,唯一的问题是我不知道哪些 OperatorProvider 服务可用。我可以实现“选择器服务”并实现一个 ServiceTracker 来管理 OperatorProvider 服务。

[edit2] 另一种方法似乎是 https://stackoverflow.com/a/32813211/7820234 与 ConfigurationAdmin 您似乎能够更改“myService.target”。扩展或实现 ConfigurationAdmin 的这一特定功能应该可以完成这项工作。

哪个是首选方式,或者有更好的选择?

【问题讨论】:

    标签: java osgi apache-felix


    【解决方案1】:

    您可以尝试一个简单的解决方案。每个 DS 组件都可以附加到一个配置管理 pid。使用此配置,您可以覆盖 @Reference 的服务过滤器。

    例如,如果您有@Reference myService;,那么您可以设置配置属性“myService.target=(color=blue)。

    这将限制对具有服务属性color=blue 的服务的引用。

    【讨论】:

    • 干杯@Christian,这听起来像是要走的路。我明天将尝试实施您的解决方案。
    • 这个周末没有太多时间,天气很好。但请注意,它是“myService.target”而不是“target.myService”。我花了一点时间才弄清楚。但它确实有效,尽管即使我的@Reference 是动态的,仍然会经历@Deactivate 和@Activate 循环,如果这正常,需要做更多的研究。
    • 您可以通过将其设为 volatile 字段来使其动态化。你可能想看看这里:enroute.osgi.org/services/org.osgi.service.component.html
    猜你喜欢
    • 2013-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多