Как ждать привязки сервиса blueprint
Я новичок в службу Blueprint, и я искал любой образец, чтобы удовлетворить требование ожидания оказываемого сервиса в контексте референтной слушателя.
У меня есть базовый комплект, который предоставляет некоторые службы ядра (БД, сеть и т. Д.), И я обертываю его интерфейсом, подобным следующему (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)'};
но выглядит довольно плохо Есть лучшие предложения?
1 ответ
Я бы сказал, что вам это не нужно ServiceHolder
, Реестр сервисов OSGi является основным "держателем сервисов" для вашего контейнера. Когда у вас есть <reference id=...>
Вы можете ввести этот реф в любого потребителя, где вы пытаетесь использовать ServiceHolder
, Контейнер примет заказ для вас.