Как вы можете получить конфигурацию ManagedService немедленно? - PullRequest
2 голосов
/ 01 октября 2011

Я использую библиотеку Felix Configuration Admin для чтения и применения файлов конфигурации для служб OSGi.Многие из настраиваемых мной служб являются сторонними (например, org.ops4j.pax.web.pax-web-jetty и org.ops4j.pax.url.mvn )и использовать простой BundleActivator, а не декларативные услуги.Я обнаружил, что каждый из этих сервисов инициализируется дважды , потому что

  1. при активации они вызывают ManagedService#updated(null) и
  2. очень короткое время спустя, ФеликсConfigurationManager.UpdateThread вызывает ManagedService#update(non-null) асинхронно.

Я ненавижу эту задержку из-за применения моей конфигурации.Это вызывает ошибочные сбои из-за присущего состояния гонки.Есть ли альтернативная реализация CM, которая может применять конфигурации синхронно, чтобы избежать этой проблемы?Или я могу сделать Феликса синхронным?(Похоже, нет, из проверки исходного кода и javadoc ManagedService .)

1 Ответ

3 голосов
/ 01 октября 2011

На самом деле обратный вызов update() из другого потока является требованием спецификации Config Admin.См. Раздел 104.5.3 Спецификации сборника R4:

Обновленный обратный вызов (словарь) от службы администратора конфигурации к управляемой службе должен выполняться асинхронно.Это требование позволяет Managed Service завершить инициализацию синхронизированным методом без вмешательства со стороны обратного вызова службы Configuration Admin.

К сожалению, это означает, что вам необходимо кодировать ManagedService в , а не имеют ошибочные сбои или присущие условия гонки.Например, если вы регистрируетесь как сервис под другим интерфейсом, кроме ManagedService, дождитесь получения ненулевого update, прежде чем зарегистрировать его под этим интерфейсом.

...