【问题标题】:Dynamic target queries in OSGi with DS使用 DS 的 OSGi 中的动态目标查询
【发布时间】:2012-04-27 18:49:27
【问题描述】:

当我在 DS 中使用引用时,我可以指定一个目标,让我可以缩小我想要的服务实例的范围。问题是所有示例都显示了必须在代码时完成的静态查询。有没有办法进行动态查询(可能从配置管理中拉入一个属性)?

如果 DS 不支持这一点,是否有另一个 OSGi 依赖注入框架(蓝图、iPojo 等)将支持这一点?

【问题讨论】:

    标签: osgi


    【解决方案1】:

    您始终可以使用引用的目标属性来执行第一级过滤器。如果您的绑定方法具有签名

    void <method-name>(<parameter-type>, Map);
    

    然后您可以在包含服务属性的地图上运行任何动态过滤器。如果过滤器不匹配,您可以忽略该组件(暂时)。

    在替代方案中,由于组件的配置可以包含引用的目标过滤器,因此您可以修改组件的配置以更改目标过滤器。

    【讨论】:

    • 我尝试了您的第一个建议,它似乎可以很好地满足我们的需求。谢谢。
    【解决方案2】:

    我使用以下技巧。如果您在服务引用上指定“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 节提到:“部署者还可以通过为设置目标属性值的组件建立配置来设置目标属性。这允许部署者覆盖组件描述中的目标属性。” - 这是一个官方功能。
    猜你喜欢
    • 2023-04-02
    • 2016-05-15
    • 1970-01-01
    • 2015-12-23
    • 2017-10-27
    • 1970-01-01
    • 2013-12-27
    • 1970-01-01
    • 2012-10-01
    相关资源
    最近更新 更多