我正在使用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)
这里的另一位开发人员能够找出解决我的问题的方法来解决不同的服务配置问题 - 长话短说,解决方案是只设置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"));
}
组件必须具有唯一的名称。但是您可以使用Component.configurationPid元素来指定组件应该使用的配置pid。并且多个组件可以使用相同的配置pid。