12.2. 서비스 내보내기
개요
이 섹션에서는 Java 오브젝트를 OSGi 서비스 레지스트리로 내보내는 방법을 설명하므로 OSGi 컨테이너의 다른 번들에 서비스로 액세스할 수 있습니다.
단일 인터페이스로 내보내기
단일 인터페이스 이름으로 OSGi 서비스 레지스트리로 서비스를 내보내려면 ref
특성을 사용하여 관련 서비스 빈을 참조하는 service
요소를 정의하고 interface 특성을 사용하여 게시된 인터페이스를
지정합니다.
예를 들어 예 12.1. “단일 인터페이스를 사용한 샘플 서비스 내보내기” 에 표시된 블루프린트 구성 코드를 사용하여 org.fusesource.example.Account
인터페이스 이름 아래에 SavingsAccountImpl
클래스의 인스턴스를 내보낼 수 있습니다.
예 12.1. 단일 인터페이스를 사용한 샘플 서비스 내보내기
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
<bean id="savings" class="org.fusesource.example.SavingsAccountImpl"/>
<service ref="savings" interface="org.fusesource.example.Account"/>
</blueprint>
여기서 ref
속성은 해당 빈 인스턴스의 ID를 지정하고 interface
속성은 서비스가 OSGi 서비스 레지스트리에 등록된 공용 Java 인터페이스의 이름을 지정합니다. 이 예제에서 사용되는 클래스 및 인터페이스는 다음과 같습니다. 예 12.2. “샘플 계정 클래스 및 인터페이스”
예 12.2. 샘플 계정 클래스 및 인터페이스
package org.fusesource.example public interface Account { ... } public interface SavingsAccount { ... } public interface CheckingAccount { ... } public class SavingsAccountImpl implements SavingsAccount { ... } public class CheckingAccountImpl implements CheckingAccount { ... }
여러 인터페이스로 내보내기
여러 인터페이스 이름으로 서비스를 OSGi 서비스 레지스트리로 내보내려면 ref
특성을 사용하여 관련 서비스 빈을 참조하는 service
요소를 정의하고 interfaces
하위 요소를 사용하여 게시된 인터페이스를 지정합니다.
예를 들어 다음 블루프린트 구성 코드를 사용하여 공용 Java 인터페이스 목록 org.fusesource.example. Account 및
목록 아래에 org.fusesource.example
.SavingsAccountSavingsAccountImpl
클래스의 인스턴스를 내보낼 수 있습니다.
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"> <bean id="savings" class="org.fusesource.example.SavingsAccountImpl"/> <service ref="savings"> <interfaces> <value>org.fusesource.example.Account</value> <value>org.fusesource.example.SavingsAccount</value> </interfaces> </service> ... </blueprint>
interface
특성 및 interfaces
요소는 동일한 service
요소에서 동시에 사용할 수 없습니다. 둘 중 하나를 사용해야 합니다.
자동 내보내기로 내보내기
구현된 모든 공용 Java 인터페이스에서 OSGi 서비스 레지스트리에 서비스를 내보내려면 auto-export
특성을 사용하여 쉽게 수행할 수 있습니다.
예를 들어 구현된 모든 공용 인터페이스 아래에 SavingsAccountImpl
클래스의 인스턴스를 내보내려면 다음 블루프린트 구성 코드를 사용합니다.
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"> <bean id="savings" class="org.fusesource.example.SavingsAccountImpl"/> <service ref="savings" auto-export="interfaces"/> ... </blueprint>
여기서 auto-export
속성의 interface
값은 블루프린트가 SavingsAccountImpl
에서 구현한 모든 공용 인터페이스를 등록해야 함을 나타냅니다. auto-export
속성에 다음과 같은 유효한 값이 있을 수 있습니다.
비활성화됨
- 자동 내보내기를 비활성화합니다. 이는 기본값입니다.
인터페이스
- 구현된 모든 공용 Java 인터페이스 아래에 서비스를 등록합니다.
class-hierarchy
-
Object
클래스를 제외한 자체 유형(클래스) 및 모든 슈퍼 유형(super-classes) 아래에 서비스를 등록합니다. all-classes
-
class-hierarchy
옵션과 유사하지만 구현된 모든 공용 Java 인터페이스도 포함됩니다.
서비스 속성 설정
또한 OSGi 서비스 레지스트리를 사용하면 서비스 속성을 등록된 서비스와 연결할 수 있습니다. 그러면 서비스 클라이언트가 서비스 속성을 사용하여 서비스를 검색하거나 필터링할 수 있습니다. 서비스 속성을 내보낸 서비스와 연결하려면 하나 이상의 빈 요소(각 서비스 속성에 대한 하나의 빈:entry
요소)가 포함된 service-properties
하위 요소를 추가합니다.
예를 들어 bank.name
문자열 속성을 비용 절감 계정 서비스와 연결하려면 다음 블루프린트 구성을 사용할 수 있습니다.
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" xmlns:beans="http://www.springframework.org/schema/beans" ...> ... <service ref="savings" auto-export="interfaces"> <service-properties> <beans:entry key="bank.name" value="HighStreetBank"/> </service-properties> </service> ... </blueprint>
여기서 bank.name
문자열 속성에는 HighStreetBank
값이 있습니다. 문자열 이외의 유형의 서비스 속성을 정의할 수 있습니다. 즉, 기본 유형, 배열 및 컬렉션도 지원됩니다. 이러한 유형을 정의하는 방법에 대한 자세한 내용은 Spring Reference Guide 에서 Advertised 속성 설정 제어를 참조하십시오.
블루프린트 네임스페이스에 속하는 항목
요소입니다. Spring의 블루프린트 구현에서 beans:entry
요소의 사용은 비표준입니다.
기본 서비스 속성
다음과 같이 서비스 요소를 사용하여 서비스를 내보낼 때 자동으로 설정할 수 있는 두 가지 서비스
속성이 있습니다.
-
osGi.service.blueprint.compname
-is always set to theid
of the service's speaker element, unless the Cryostat is inlined (that is, the mutual is defined as a child element of theservice
element).인라인 빈은 항상 익명입니다.
-
ranking 속성이 0이 아닌 경우
service.ranking
-is 자동으로 설정됩니다.
순위 속성 지정
번들이 서비스 레지스트리에서 서비스를 조회하고 일치하는 서비스를 두 개 이상 찾으면 순위를 사용하여 반환된 서비스를 확인할 수 있습니다. 규칙은 조회가 여러 서비스와 일치할 때마다 순위가 가장 높은 서비스가 반환됩니다. 서비스 순위는 음수가 아닌 정수일 수 있으며 0
은 기본값입니다. 서비스 요소에서 순위 속성을 설정하여 서비스 순위를
지정할 수 있습니다. 예를 들면 다음과 같습니다.
<service ref="savings" interface="org.fusesource.example.Account" ranking="10"/>
등록 리스너 지정
서비스 등록 및 등록 취소 이벤트를 추적하려면 등록 및 등록 취소 이벤트 알림을 수신하는 등록 리스너 콜백 빈을 정의할 수 있습니다. 등록 리스너를 정의하려면 registration-listener
하위 요소를 service
요소에 추가합니다.
예를 들어 다음 블루프린트 구성은 registration-listener
요소에서 참조하는 리스너 8080 listenerBean
을 정의하여 계정
서비스가 등록되거나 등록되지 않을 때마다 리스너 28이 콜백을 수신하도록 합니다.
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" ...> ... <bean id="listenerBean" class="org.fusesource.example.Listener"/> <service ref="savings" auto-export="interfaces"> <registration-listener ref="listenerBean" registration-method="register" unregistration-method="unregister"/> </service> ... </blueprint>
registration-listener
요소의 ref
속성이 리스너 8080의 ID를 참조하는 경우 registration-method
속성은 등록 콜백을 수신하는 리스너 메서드의 이름을 지정하고, unregistration-method
속성은 등록 콜백을 수신하는 리스너 메서드의 이름을 지정합니다.
다음 Java 코드는 등록 및 등록 취소 이벤트 알림을 수신하는 Listener
클래스의 샘플 정의를 보여줍니다.
package org.fusesource.example; public class Listener { public void register(Account service, java.util.Map serviceProperties) { ... } public void unregister(Account service, java.util.Map serviceProperties) { ... } }
메서드 이름, 등록
및 등록 취소
는 각각 registration-method
및 unregistration-method
속성으로 지정됩니다. 이러한 메서드의 서명은 다음 구문을 준수해야 합니다.
-
첫 번째 메서드 인수- 서비스 오브젝트 유형에서 할당할 수 있는 모든 유형 T입니다. 즉, 서비스 클래스의 모든 슈퍼타입 클래스 또는 서비스 클래스에 의해 구현된 모든 인터페이스입니다. 이 인수에는 서비스 빈에서
프로토타입
으로범위를
선언하지 않는 한 서비스 인스턴스가 포함됩니다. 이 경우 이 인수가null
입니다(범위가프로토타입
인 경우 등록 시 사용 가능한 서비스 인스턴스가 없습니다). -
두 번째 메서드 인수-
java.util.Map
유형 또는java.util.Dictionary
유형이어야 합니다. 이 맵에는 이 서비스 등록과 연결된 서비스 속성이 포함되어 있습니다.