单个配置实例与多个配置实例
您也可以使用 OSGi 元类型服务来配置多个配置实例。
如使用 OSGi 元类型服务来描述配置中所述,可以使用 OSGi 元类型服务来支持给定服务的一组配置属性(由配置 PID 所标识)。例如,另一种常见情况是以 Liberty 概要文件支持应用程序和数据源的多个条目的方式,支持同一种配置类型的多个实例。要这样做,可以提供元类型定义来告知 Liberty 配置解析器及配置管理服务,它正在处理工厂配置。此外,收到该配置的类也需要实现 org.osgi.service.cm.ManagedServiceFactory 接口。
要支持 server.xml 文件中顶级配置元素的多个实例,如下所示:
<server>
<teenager name="joy" age="15" />
<teenager name="angela" age="18" />
</server>
必须通过将 factoryPid 属性添加至 Designate 元素,在元数据中定义配置。
注: 如果使用 ManagedServiceFactory 接口来接收配置,那么仍需要 pid 属性;如果使用声明式服务 (DS) 组件,那么此属性不是必需的。
<?xml version="1.0" encoding="UTF-8"?>
<metatype:MetaData xmlns:metatype="http://www.osgi.org/xmlns/metatype/v1.1.0"
xmlns:ibm="http://www.ibm.com/xmlns/appservers/osgi/metatype/v1.0.0">
<OCD id="teenager-ocd" name="teenager" >
<AD id="name" name="name" type="String" />
<AD id="age" name="age" type="Integer" />
</OCD>
<Designate factoryPid="teenager" pid="teenager">
<Object ocdref="teenager-ocd" />
</Designate>
</metatype:MetaData>
使用如下所示的工厂 pid 将 ManagedServiceFactory 实现注册为 ManagedServiceFactory 服务类型:
bundleContext.registerService(ManagedServiceFactory.class, new MgdSvcFactoryImpl(), new Hashtable();
defaults.put(org.osgi.framework.Constants.SERVICE_PID, "teenager"));
ManagedServiceFactory 实现会收到每个 teenager 配置实例的一个属性集,而各个属性集均由其自己的内部生成 PID(提供给 updated() 方法)唯一标识,如下所示:
public void updated(String pid, Dictionary<String, ?> properties)
throws ConfigurationException {
String name = (String) properties.get("name");
Integer age = (Integer) properties.get("age");
}
如果删除特定的配置实例(例如,由于从 server.xml 文件中删除了其中一个 teenager 元素),那么会通过 deleted() 方法来通知 ManagedServiceFactory 实现,并且会提供所删除实例的 pid。这让 ManagedServiceFactory 实现可以跟踪在任何给定时刻为有效的实例。