Как отменить регистрацию службы OSGI/Blueprint из службы?

В моем приложении есть Service ChatProtocolClient. Реализация представляет собой tcp-клиент, который подключается к удаленному серверу с помощью «метода инициализации» и отключается с помощью «метода уничтожения».

У меня также есть другой пакет, который использует соединение этого ChatProtocolClient для чтения и отправки сообщений из канала, ChatChannel. В настоящее время у меня есть файл xml, который создает bean-компонент ChatProtocolClient и создает bean-компонент ChatChannel, в который вводится ссылка на созданную службу ChatProtocolClient.

Но как я могу обрабатывать отключения от сервера? Я хотел бы сообщить платформе Blueprint, что мой экземпляр ChatProtocolClient сейчас непригоден для использования, и он должен отменить регистрацию этого экземпляра.

Предпочтительно, чтобы Blueprint автоматически вызывал метод destroy для всех зависимых bean-компонентов (bean-компонентов, в которые Blueprint внедрил эту ссылку на службу) и инициализировал новый bean-компонент ChatProtocolClient и все bean-компоненты, которые были уничтожены из-за сбоя зависимости.

Как это может быть сделано?


person Tom Mercelis    schedule 16.08.2012    source источник


Ответы (1)


Я нашел способ реализовать это. В этих решениях не Blueprint воссоздает экземпляры всех зависимых служб. Это выглядит так:

  1. Подключение бинов "Сторожевой".

Вместо создания бинов ChatProtocolClient я создал бины ConnectionWatchDog из xml. В эти bean-компоненты вводится BundleContext, а свойства соединения устанавливаются из файла .xml. Затем ConnectionWatchDog пытается создать или подключить экземпляр ChatProtocolClient. Если соединение установлено успешно, служба регистрируется в BundleContext (с помощью bundleContext.registerService(..)). ServiceRegistration хранится в сторожевом таймере. Сторожевой таймер проверяет соединение с заданным интервалом (он запускает собственный поток). Если кажется, что соединение не удалось; сторожевой таймер вызывает serviceRegistration.unregister() и очищает остатки экземпляра клиентского соединения и запускает весь процесс создания, подключения и регистрации нового экземпляра ChatProtocolClient.

  1. Чатканал

ChatChannel теперь настроен в Blueprint с расширением . xml выглядит так:

<blueprint xmlns=...>
    <reference-list id="chat-connection" member-type="service-object" interface="com.example.ChatProtocolClientInterface">
      <reference-listener bind-method="onBind" unbind-method="onUnbind" ref="Channel1"/>
    </reference-list>
    <bean id="Channel1" class="ChatChannel" init-method="startUp">
       <property name="chatProtocolClient" ref="chat-connection">
       ... some other properties ...
    </bean>
</blueprint>

Тип члена, установленный на объект службы, означает, что когда служба зарегистрирована или не зарегистрирована, ChatChannel будет проинформирован с помощью методов «onBind» и «onUnbind». В качестве параметра они получат экземпляр ChatProtocolClientInterface.

Я не уверен, что это единственное или лучшее решение, но оно работает для меня. Обратите внимание, что в этом примере xml вам также понадобится установщик для «chatProtocolClient»; в настоящее время я не использую список, заданный планом, и использую только методы onBind и onUnbind.

person Tom Mercelis    schedule 10.09.2012