【问题标题】:Blueprint: how do I check if an optional dependency is satisfied?蓝图:如何检查是否满足可选依赖项?
【发布时间】:2012-06-03 09:03:46
【问题描述】:

blueprint.xml 中,我以这种方式声明了一个可选依赖项:

<reference id="RepositoryListener"
    interface="ru.focusmedia.odp.server.datastore.api.RepositoryListener"
    availability="optional" />

<bean id="Repository"
    class="ru.focusmedia.odp.server.datastore.jpa.repository.RepositoryImpl">
    <jpa:context property="entityManager" unitname="ODP_Server" />
    <tx:transaction method="*" value="Required" />
    <property name="repositoryListener" ref="RepositoryListener" />
</bean>

RepositoryImpl,我有

public void setRepositoryListener(RepositoryListener repositoryListener) {
    logger.info("Repository listener set");
    this.repositoryListener = repositoryListener;
}

正如预期的那样,即使没有可用的RepositoryListener 服务,Blueprint 也会调用此方法。问题是,我以后如何检查是否有 服务?

    if (repositoryListener != null) {
        repositoryListener.notifyDelete(node);
    } else {
        logger.warn("No repository listener set!");
    }

不起作用,因为 repositoryListener 不是 null,而是蓝图代理。

【问题讨论】:

  • 我的知识有限,但是可以为 指定一个称为 的东西,并且可能链接到您的 Repository bean。

标签: osgi blueprint-osgi


【解决方案1】:

共有三个选项。

  • 通常情况下,如果尝试使用(缺失的)可选服务,您会在蓝图等待支持服务出现时延迟五分钟,然后是ServiceUnavailableException。因此,一种选择是设置一个非常短的蓝图超时,并捕获 ServiceUnavailableException。
  • 可以说是更简洁的选项是使用引用侦听器来监视服务的生命周期。这具有需要额外代码的缺点。
  • 最简单的 - 因此也是最懒惰的 - 选项是使用可选引用列表而不是可选引用。如果不存在令人满意的服务,则列表将为空。当然,如果存在多项令人满意的服务,您将不得不考虑您希望发生什么。

要设置更短的超时时间,只需在您的可选服务引用中添加一个属性:

<reference
    id="someReference"
    interface="org.some.service.ServiceInterface"
    availability="optional"
    timeout="100" />

要使用引用侦听器,您需要在蓝图 xml 中添加类似以下内容(在Enterprise OSGi in Action 的第 6 章中有更详细的示例和讨论):

<reference
        id="someReference"
        interface="org.some.service.ServiceInterface">
        <reference-listener
            ref="someBean"
            bind-method="bind"
            unbind-method="unbind" />
    </reference>

bindunbind 方法在您的服务出现和消失时被调用(或者,如果您正在使用参考列表,则在您的参考列表中添加和删除服务时)。

使用引用列表实际上并不需要代码示例 - 只需使用 &lt;reference-list 元素并确保您的 setter 方法采用 List。

【讨论】:

  • 是的,我也想到了第三个版本。对我来说可能是最好的选择。
猜你喜欢
  • 2014-04-08
  • 2011-05-07
  • 1970-01-01
  • 2020-09-11
  • 2019-09-12
  • 1970-01-01
  • 1970-01-01
  • 2018-04-11
  • 2010-12-06
相关资源
最近更新 更多