단일 구성 인스턴스 대 다중 구성 인스턴스
OSGi Metatype Service를 사용하여 여러 구성 인스턴스를 구성할 수도 있습니다.
OSGi Metatype Service를 사용하여 구성 설명에 설명된 대로 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>
다음과 같이 ManagedServiceFactory 구현이
ManagedServiceFactory 서비스 유형으로 팩토리 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 구현이 지정된 임의의 시점에 유효한 인스턴스를 계속 추적할 수 있습니다.