osgi - 如何根据配置绑定(bind)动态引用?

标签 osgi apache-felix osgi-bundle felix-dependency-manager

我有以下消费者组件,它使用名为sender的引用服务,

    @Component(configurationPolicy = ConfigurationPolicy.REQUIRE, configurationPid = DATA_SYNC_CONFIG)
    public class DataSynchronizer {

        @Reference
        private TelemetrySender sender;

        //calls some methods of sender
}

只要有一个接口(interface) TelementrySender

的实现,这种方法就可以正常工作。

但是,如果该接口(interface)有两个实现,并且如果我想根据配置属性选择要绑定(bind)的实现,那么正确的方法是什么?根据我的理解和发现,尝试了以下方法。

在我的组件中包含了一个绑定(bind)方法,如下所示。

   @Component(configurationPolicy = ConfigurationPolicy.REQUIRE, configurationPid = DATA_SYNC_CONFIG)
    public class DataSynchronizer {

        private TelemetrySender sender;

       @Reference
        void setSender(TelemetrySender telemetrySender ) {
            // read configuration and set only correct implementation 
           this.sender= telemetrySender ;
         }

        //calls some methods of sender
}

我的一个 TelemetrySender 实现如下,

@Component(configurationPolicy = ConfigurationPolicy.REQUIRE, configurationPid = HTTP_TELEMETRY_SENDER_CONFIG,property={ "service=http" })
 public class HttpConnector implements TelemetrySender {
}

我的问题是如何在 setSender 方法中选择正确的 TelemntrySender ?或者,如果我使用了错误的方法,请纠正我。我提到this article

最佳答案

最简单的方法是在配置中使用属性sender.target=<search filter> 。 请参阅OSGi compendium 112.6.2.1 .

因此,如果您要绑定(bind)的服务具有属性 sendername=my 那么您可以设置:

sender.target=(sendername=my)

关于osgi - 如何根据配置绑定(bind)动态引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58966268/

相关文章:

java - OSGI Felix 容器正在初始化模拟私有(private)字段

java - 如何在 OSGI 的 Activator 类中使用 Eclipse Interface Command Provider

java - 远程 OSGI 服务调用

java - BundleActivator 方法未在 OSGi 中得到通知

java - 如何在 Equinox 中定义类路径目录?

java - 嵌入式 Felix 无法将激活器转换为 BundleActivator

java - 使 maven 依赖 OSGi 准备就绪

osgi - 用 OSGi 片段替换类/资源 - 可以不在片段中包含 jar 吗?

java - 声明式 OSGi 服务

java - 为什么我在启动服务时收到 "Activator not found"?