Как использовать один файл конфигурации для нескольких сервисов osgi - PullRequest
0 голосов
/ 20 марта 2019

Я работаю с OSGi R7, и у меня есть случай, когда было бы удобно использовать один файл конфигурации для двух отдельных служб, вместо нового файла конфигурации для каждой службы. Я попытался с помощью свойства @Component name установить общий конфигурационный файл, но это не сработало (например, предупреждение / ошибка с повторяющимся PID - см. Ниже). Еще я попробовал определить интерфейс конфигурации службы только в одной службе и попытался использовать его в обеих, но, похоже, это тоже не работает, так как я не перехватываю точку останова в моем методе @Activate второго сервиса .

@ObjectClassDefinition(name = "My 1st Service Config")
@interface FirstServiceConfig {

  String filePath() default "/path/to/my/file";

}
@Component(immediate = true, name = "com.my.generic.config", configurationPolicy = ConfigurationPolicy.REQUIRE, service = {
    FirstService.class })
@Designate(ocd = FirstServiceConfig.class)



@ObjectClassDefinition(name = "My 2nd Service Config")
@interface SecondServiceConfig {

  String filePath() default "/path/to/my/file";

}
@Component(immediate = true, name = "com.my.generic.config", configurationPolicy = ConfigurationPolicy.REQUIRE, service = {
    SecondService.class })
@Designate(ocd = SecondServiceConfig.class)

Ответы [ 2 ]

0 голосов
/ 21 марта 2019

Компоненты должны иметь уникальные имена. Но вы можете использовать элемент Component.configurationPid , чтобы указать pid конфигурации, который должен использоваться компонентом. И несколько компонентов могут использовать один и тот же конфигурационный pid.

0 голосов
/ 20 марта 2019

Другой разработчик смог найти решение моей проблемы, изучив другую проблему конфигурации службы - короче говоря, решение заключалось в том, чтобы установить только 1 конфигурацию, связанную с 1 PID, но затем в методе активации второй службы.Вы можете получить доступ к конфигурации любой службы через службу ConfigurationAdmin, а затем получить значение конфигурации с помощью ключа:

@Reference
ConfigurationAdmin configAdmin;

@Activate
public void activate() throws IOException {
  Configuration conf = configAdmin.getConfiguration("pid.value.goes.here");
  Dictionary<String, Object> props = conf.getProperties();

  filePath = String.valueOf(props.get("configFilePath"));
}
...