Как ждать привязки сервиса 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, Контейнер примет заказ для вас.

Другие вопросы по тегам