我正在使用osgi组件/服务的多个实例。 这些osgi组件配置了配置policy = required,并通过ConfigurationAdmin添加或删除配置来实例化和删除。 此外,我使用服务实例的“集合”,并且每个集合通过其配置配置为仅使用来自相同集合的服务实例作为引用(ref.target =(id =“123”))。
问题: 在某些时候,应删除一组。但是,当通过ConfigAdmin从一组中删除配置对象时,一组不同的服务也会停用。它们会立即重新激活,但它们会丢失所有服务引用并且无法使用。
我无法弄清楚他们为什么要停用。
修改
服务通常定义如下:
@Component(policy = ConfigurationPolicy.REQUIRE)
@Service
public class AServiceImpl implements AService {
@Reference(target = "(service.pid=*)")
BService bService;
...
}
BServiceImpl也使用所需的配置策略。
由于felix scr:
中的文档片段,目标在注释中设置服务目标过滤器,用于选择要使用的特定服务。为了能够通过配置属性覆盖此值的值,必须声明此参数。如果未声明参数,则不会生成相应的声明属性
当实例化新服务“set”时,将对该组的每个服务执行这些步骤:
每项服务
Configuration serviceConfiguration = configurationAdmin.createFactoryConfiguration(serviceInterfaceName, null);
每个服务的每个参考
Properties serviceProperties.put(ref + ".target", "(" + PID + "=" + pid + ")");
...
serviceConfiguration.update(dict);
我在bindXXX()方法中记录了引用的配置属性 pid ,过滤器似乎有效。我总是得到相同pid的引用。
我将在github上添加一个运行示例asap。
EDIT2
我添加了一个演示行为的示例。我创建了两组“服务”,调用服务函数并在函数完成后删除服务集。删除服务集1时,服务集2重新激活。
代码示例 https://github.com/andineupert/osgi-configadmin-example.git
答案 0 :(得分:1)
我终于意识到这是由声明服务的旧的equinox实现引起的。我切换到org.apache.felix.scr 2.0.4,现在它工作得很好。