0

我是 Blueprint 服务的新手,我寻找任何示例来满足在引用侦听器上下文中等待服务启动的要求。

我有一个提供一些内核服务(db、network 等)的核心包,我用如下接口(blueprint.xml)包装它:

<bean id="ServiceImplBean" class="com.mysite.service.impl.ServiceImpl" factory-Method="getInstance"/>
<service id="MyServiceInterface" ref="ServiceImplBean" interface="com.mysite.service.IService"></service>

在另一个包中,我使用参考侦听器来侦听正在启动和运行的服务,蓝图如下:

<bean id="ServiceHolderBean" class="com.mysite.consumer.ServiceHolder" factory-method="getInstance" />
<reference id="ServiceHolderBeanReference" interface="com.mysite.service.IService">
    <reference-listener ref="ServiceHolderBean" bind-method="bind" unbind-method="unbind" />
</reference>

下面是 ServiceHolder 类,它将 IService 带入其领域并保留以供进一步使用:

public class ServiceHolder {
    private static ServiceHolder instance = new ServiceHolder();
    private IService service;

    private ServiceHolder() {
    }

    public static ServiceHolder getInstance() {
        return instance;
    }

    public void bind(IService service) {
        this.service = service;
    }

    public void unbind(IService service) {
        this.service = null;
    }

    public IService getService() {
        return this.service;
    }
}

目的是在消费者捆绑包中,我可以轻松地使用ServiceHolder.getInstance().getService()来使用该服务。

问题是有时在捆绑启动的初始阶段或注册服务之前需要该服务。显然,当调用 getService() 时我会得到一个空值。

捆绑启动时使用蓝图满足服务需求的最佳实践是什么?我想我可以使用类似的东西,while (service == null) { Thread.sleep(5000)'};但它看起来很糟糕。有更好的建议吗?

4

1 回答 1

0

我会说你不需要这个ServiceHolder。OSGi 服务注册中心是容器的主“服务持有者”。一旦你有了 ,<reference id=...>你就可以将该 ref 注入到任何你试图使用ServiceHolder. 容器将为您接单。

于 2013-11-21T18:33:16.753 回答