2013-07-29 2 views
1

Я разрабатываю приложение OSGi, которое состоит из нескольких пачек. Все они зависят от EventAdmin. Тем не менее, один конкретный подключаемый модуль должен запустить запланированную задачу, как только запущен пакет (т. Е. В методе запуска активатора). Проблема в том, что служба администратора событий еще не зарегистрирована, и я должен дождаться ее развертывания. Я не хотел бы делать это через файл свойств конфигурации, поэтому есть ли какая-либо операция для этого без файла свойств Felix?Как подождать до другого пакета?

спасибо заранее

ответ

0

Я использовал iPOJO для этого. Он предназначен для использования в felix & karaf. Эта библиотека понимает жизненный цикл и зависимости компонентов, и вы будете уведомлены с помощью методов @Validate и @Invalidate, когда доступны зависимости компонентов или один или несколько.

Он также поддерживает @Bind и @Unbind, когда появляется или исчезает реализация сервиса (интерфейса). Это делает подписки намного проще.

У вас есть слушатель для службы и этот компонент @ Предоставляет интерфейс для вызова. Затем центральный регистр событий будет вызываться по методу @Bind, когда появляется такой компонент, и @Unbind, когда он по какой-либо причине уходит.

Я подозреваю, что iPOJO должен выполнять все управление зависимостями и привязку, которые вам нужны.

2

В OSGi нет начального заказа ... хотя есть механизмы, влияющие на первоначальный порядок запуска, проблема в том, что любой комплект может остановиться в любое время. Таким образом, единственное решение - фактически обрабатывать вашу зависимость от Admin Admin.

С декларативными услугами (DS) это на самом деле очень мало работы. Кроме того, пожалуйста, забудьте о активаторах пучков, они представляют собой единичные пакеты и, таким образом, являются плохими идеями. Таким образом, в DS вы должны сделать следующее (с помощью аннотаций):

@Component(immediate=true) 
public class MyTask extends Thread { 
    EventAdmin ea; 


    public void run() { 
     while (!isInterrupted()) { 
      // do something 
      ea.postEvent(...); 
     } 
    } 

    @Activate void activate()      { this.start();} 
    @Deactivate void deactivate()     { this.interrupt(); } 
    @Reference void setEventAdmin(EventAdmin ea) { this.ea = ea;} 
} 

Есть редкие случаи, вы не должны использовать DS и застревают с Bundle-активаторов, но они редки и должны стать более редкими. Если вы застряли в таком действительно плохом случае, вы также можете создать трекер службы в методе запуска активатора Bundle и отслеживать службы Event Admin. Как только вы его получите, вы создаете поток для запуска своего кода. Когда служба исчезает, вы прерываете поток. Однако это гораздо более сложное решение.

Есть и другой менеджер зависимости службы, но я настоятельно рекомендую декларативные услуги с их аннотациями.

Смежные вопросы