2016-08-04 2 views
0

У меня есть этот компонент (псевдо-код):Лучшего подход для обработки динамического дополнения услуг

@Component 
class ServiceComponent { 
    Set<MyService> set = synchronizedSet(); 

    @Activate 
    activate(){... process set...} 

    @Reference 
    addService(MyService service){set.add(service)} 
} 

Теперь, на начальном этапе, когда компонент активирован, он будет добавлять все доступные экземпляры MyService. Но как мне лучше обрабатывать дополнения после активации компонента?

ответ

0

На самом деле ваш код в письменном виде получит только один экземпляр MyService, так как по умолчанию у ссылок есть мощность 1..1.

Для привязки ко всем экземплярам, ​​изменить эталонную заявление следующим образом:

@Reference(cardinality = ReferenceCardinality.MULTIPLE, 
      policy = ReferencePolicy.DYNAMIC) 
void addService(MyService service) { 
    set.add(service); 
} 

Имейте в виду, что этот метод может быть вызван после или даже во время метода activate().

+0

Да, я знаю, поэтому я написал это псевдокод. Извините за путаницу, но как лучше всего справиться с динамическим поведением дополнений/абзацев. Я имею в виду, например, использовать наблюдаемый список (из Eclipse JFace), чтобы прослушать набор после его изменения после активации компонента. Но есть ли лучшие практики в чистом OSGi? –

+0

Это зависит от того, что ваш код должен делать с этой информацией. –

+0

Если вы используете наблюдаемый SWT/JFace, помните, что вы не можете предсказать, из какого потока будет вызываться метод addService. Поэтому вы не можете напрямую обновлять пользовательский интерфейс из этого метода. Вам нужно будет использовать 'Display.asyncExec', чтобы внести какие-либо изменения в пользовательский интерфейс, связанные с добавленной услугой. В Swing эквивалент будет 'SwingUtilities.invokeLater'. –

0

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

@Reference 
volatile Set<MyService> services;