我是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)'};
这样的东西,但看起来很糟糕。还有更好的建议吗?
答案 0 :(得分:0)
我会说你不需要这个ServiceHolder
。 OSGi服务注册表是容器的主“服务持有者”。获得<reference id=...>
之后,您可以将该ref注入您尝试使用ServiceHolder
的任何消费者。容器将为您订购。