带DS的OSGi中的动态目标查询

带DS的OSGi中的动态目标查询,osgi,Osgi,当我在DS中使用引用时,我可以指定一个目标,该目标将允许我缩小所需的服务实例的范围。问题是,所有示例都显示了必须在代码时完成的静态查询。是否有一种方法可以执行动态查询(可能从配置管理员中提取属性) 如果DS不支持此功能,是否还有另一个OSGi依赖项注入框架(blueprint、iPojo等)支持此功能?您可以始终使用引用的target属性来形成一级过滤器。如果您的bind方法具有签名,则 void <method-name>(<parameter-type>, Map);

当我在DS中使用引用时,我可以指定一个目标,该目标将允许我缩小所需的服务实例的范围。问题是,所有示例都显示了必须在代码时完成的静态查询。是否有一种方法可以执行动态查询(可能从配置管理员中提取属性)


如果DS不支持此功能,是否还有另一个OSGi依赖项注入框架(blueprint、iPojo等)支持此功能?

您可以始终使用引用的target属性来形成一级过滤器。如果您的bind方法具有签名,则

void <method-name>(<parameter-type>, Map);
void(,Map);
然后,您可以在包含服务属性的映射上运行任何动态筛选器。如果过滤器不匹配,您可以忽略该组件(暂时)


在备选方案中,由于组件的配置可以包含引用的目标筛选器,因此可以修改组件的配置以更改目标筛选器。

我使用以下技巧。如果在服务引用上指定“target”属性,但将其值保留为空字符串,则在运行时将使用名称相同但后缀为“.target”的组件属性

在下面的示例中,我通过Karaf容器中的.cfg文件动态选择JDBC源代码。“datasourcefactory.target”属性自动注入到“datasourcefactory”引用的“target”属性中

警告:我不知道这个技巧是否得到官方支持,或者只是Felix的SCR功能。我一直想在说明书中查一下,看看是否有提到+1任何澄清其合法性的评论

    @Component(
            name = "...",
            specVersion = "1.1",
            policy = ConfigurationPolicy.REQUIRE,
            metatype = true
    )
    @Property(name = "dataSourceFactory.target",
            value = "",
            label = "dataSourceFactory target",
            description = "An OSGi service filter to select the data source provider. "+
                    "For example: '(&(osgi.jdbc.driver.name=derby)(objectClass=org.osgi.service.jdbc.DataSourceFactory))' where 'derby' is the important bit and the rest is boilerplate. "+
                    "See DataSourceFactory.OSGI_JDBC_DRIVER_(NAME,CLASS,VERSION)."
    )
    @Reference(
            name = "dataSourceFactory",
            referenceInterface = org.osgi.service.jdbc.DataSourceFactory.class,
            cardinality = ReferenceCardinality.MANDATORY_UNARY,
            target = "", // must be overwritten by configuration property named "dataSourceFactory.target"
            bind = "bindDataSourceFactory",
            unbind = "unbindDataSourceFactory"
    )

我仔细考虑了你的第一个建议,它似乎很适合我们的需要。谢谢。OSGi 4.2服务概要的第112.3.4节提到:“部署人员还可以通过为组件建立配置来设置目标属性,该配置设置目标属性的值。这允许部署人员覆盖组件描述中的目标属性。”-这是一项官方功能。