我是 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)'};
但它看起来很糟糕。有更好的建议吗?