單一配置實例與多重配置實例

您也可以利用 OSGi meta 類型服務來配置多重配置實例。

依照利用 OSGi meta 類型服務說明配置中的說明,您可以利用 OSGi meta 類型服務來支援給定服務的單一配置內容集(如配置 PID 所識別)。 另外,支援相同配置類型的多重實例也很常見,比方說,依照 Liberty 支援多重應用程式和資料來源項目的相同方式。 藉由提供 meta 類型定義,告訴 Liberty 配置剖析器和「配置管理」服務,它要處理 Factory 配置,即可執行此動作。 另外,接收配置的類別必須實作 org.osgi.service.cm.ManagedServiceFactory 介面。

如果要在 server.xml 檔中支援最上層配置元素的多重實例,程式碼如下:
<server>
    <teenager name="joy" age="15" />
    <teenager name="angela" age="18" />
</server>
您必須新增 factoryPid 屬性到 Designate 元素中,以將配置定義在 meta 資料中。
註: 如果您利用 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>
ManagedServiceFactory 實作登錄為一項 ManagedServiceFactory 服務類型,Factory pid 如下:
bundleContext.registerService(ManagedServiceFactory.class, new MgdSvcFactoryImpl(), new Hashtable();
defaults.put(org.osgi.framework.Constants.SERVICE_PID, "teenager"));
ManagedServiceFactory 實作會接收每個 teenager 配置實例各一組內容,每個實例都依照下列方式,用提供給 updated() 方法的它自己(內部產生)的 PID 來唯一識別:
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