【问题标题】:Blueprint mandatory dependancy to mandatory dependency蓝图强制依赖到强制依赖
【发布时间】:2015-08-20 18:01:21
【问题描述】:

请帮我解决一个问题。我有一个 osgi 包。蓝图配置如下所示

<?xml version="1.0" encoding="UTF-8"?>
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">

    <bean class="test.SomeBean">
        <argument>
            <reference-list availability="mandatory" member-type="service-object" interface="test.Service1"/>
        </argument>
    </bean>

    <service interface="test.Service1">
        <bean class="test.Service1Impl">
            <argument>
                <reference-list availability="mandatory" member-type="service-object" interface="test.Service2"/>
            </argument>
        </bean>
    </service>

    <service interface="test.Service2">
        <bean class="test.Service2Impl"/>
    </service>

</blueprint>

部署后我得到一个 java.util.concurrent.TimeoutException。如果我将 Service2 声明移至另一个捆绑包或将可用性更改为可选,则一切正常。为什么?

【问题讨论】:

    标签: osgi blueprint-osgi


    【解决方案1】:

    原因是您依赖于您也提供的服务。对于强制性服务,BLueprint 无法做到这一点。

    原因是,每当蓝图遇到强制引用时,它都会确保在开始之前解决依赖关系。只有当所有强制引用都解决后,上下文的服务才会被发布。

    【讨论】:

    • 有没有可能解决这个问题?我需要有一个强制性的可用性。如果我将“可用性”更改为“可选”,则 Service2 实现会不时出现。我需要知道 Service2 的至少一个实现是绑定的,并且只有在该应用程序被初始化之后。对不起我的英语)我希望你能明白我想说的话)
    • 据我所知,在蓝图中没有简单的方法。您可能想看看支持这种行为的声明式服务。
    • 你知道为什么蓝图容器的工作如此不稳定吗?我的意思是我不能确定我的服务的所有实现都可以访问。例如,我有 3 个提供 Service2 接口的服务。在一个配置中声明的所有服务。我无法预测每次哪些服务将绑定到参考列表或没有。依赖于没有帮助。
    • 它不是不稳定的。它是动态的。在 OSGi 中,您必须处理服务可以随时来来去去的事实(例如,因为提供它们的包已停止)。你想达到什么目标?您只想在所有服务都运行时运行您的代码?
    • 是的,但我也需要动态
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-18
    • 1970-01-01
    • 1970-01-01
    • 2017-04-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多