如何等待蓝图服务绑定

时间:2013-11-20 18:10:39

标签: java osgi blueprint

我是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()时我会得到一个null。

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

1 个答案:

答案 0 :(得分:0)

我会说你不需要这个ServiceHolder。 OSGi服务注册表是容器的主“服务持有者”。获得<reference id=...>之后,您可以将该ref注入您尝试使用ServiceHolder的任何消费者。容器将为您订购。