Я разрабатываю приложение с OSGi. Изучая компендиум OSGi 6.0 (раздел 112.8.1) I наткнулся на декларативный сервис; в частности я посмотрел следующий абзац:
Для поля значения по умолчанию для аннотации ссылки:
- Имя метода или поля привязки используется в качестве имени ссылки.
- Мощность 1:1, если поле не является коллекцией. 0..n мощность, если поле является коллекцией.
- Статическая неохотная политика, если поле не объявлено изменчивым. Динамическая неохотная политика, если поле объявлено изменчивым
- Запрашиваемая услуга является типом поля.
Например:
@Reference volatile Collection<LogService> log;
Теперь я прочитал из OSGi Нила Бартлетта на практике (раздел 11.10.2), что синхронизация и параллелизм Методы bind и unbind Reference annotation
немного сложны (особенно в сценариях динамической политики). В частности, потокобезопасным примером ссылки на службу через аннотацию может быть:
@Component( provide = MailboxListener.class, properties = { "service.ranking = 10"})
public class LogMailboxListener implements MailboxListener {
private final AtomicReference<Log> logRef = newAtomicReference <Log> () ;
public void messagesArrived ( String mboxName, Mailbox mbox, long [ ] ids ) {
Log log = logRef.get();
if (log != null )
log.log(Log.INFO, ids.length + "message(s) arrived in mailbox " + mboxName, null);
else
System.err.println("No log available!");
}
@Reference( service = Log.class, dynamic = true, optional = true )
public void setLog(Log log) {
logRef.set(log);
}
public void unsetLog(Log log) {
logRef.compareAndSet(log, null);
}
}
Я думаю, что понял из книги, почему динамическая политика нуждается в этих настройках из многопоточного сценария. У меня такой вопрос: если бы аннотация ссылки находилась в поле (декларативная служба 1.3), как я мог бы добиться потокобезопасности? Только определив ссылку как «изменчивую» (как предполагает компендиум)? Или есть какая-то хитрая часть, которая создаст проблемы в приложении?
Спасибо за любой ответ