单个配置实例与多个配置实例

您也可以使用 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>
public void updated(String pid, Dictionary<String, ?> properties)
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 实现可以跟踪在任何给定时刻为有效的实例。


用于指示主题类型的图标 参考主题

文件名:rwlp_extensions_instances.html