Лучший подход для обработки динамического добавления услуг
У меня есть этот компонент (псевдокод):
@Component
class ServiceComponent {
Set<MyService> set = synchronizedSet();
@Activate
activate(){... process set...}
@Reference
addService(MyService service){set.add(service)}
}
Теперь, изначально, когда компонент активирован, он будет добавлять все доступные экземпляры MyService. Но как мне лучше обрабатывать добавления после активации компонента?
2 ответа
В последней версии DS вы можете делать полевые аннотации. Если вы укажете поле, которое будет изменчивым, оно будет обновляться при входе новых сервисов.
@Reference
volatile Set<MyService> services;
На самом деле ваш код, как написано, получит только один экземпляр MyService
потому что ссылки имеют кардинальность 1..1 по умолчанию.
Для привязки ко всем экземплярам измените объявление ссылки следующим образом:
@Reference(cardinality = ReferenceCardinality.MULTIPLE,
policy = ReferencePolicy.DYNAMIC)
void addService(MyService service) {
set.add(service);
}
Имейте в виду, что этот метод может быть вызван после или даже во время activate()
метод.