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.SavingsAccount 목록 아래에 SavingsAccountImpl 클래스의 인스턴스를 내보낼 수 있습니다.

<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 the id of the service's speaker element, unless the Cryostat is inlined (that is, the mutual is defined as a child element of the service 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-methodunregistration-method 속성으로 지정됩니다. 이러한 메서드의 서명은 다음 구문을 준수해야 합니다.

  • 첫 번째 메서드 인수- 서비스 오브젝트 유형에서 할당할 수 있는 모든 유형 T입니다. 즉, 서비스 클래스의 모든 슈퍼타입 클래스 또는 서비스 클래스에 의해 구현된 모든 인터페이스입니다. 이 인수에는 서비스 빈에서 프로토타입 으로 범위를 선언하지 않는 한 서비스 인스턴스가 포함됩니다. 이 경우 이 인수가 null 입니다(범위가 프로토타입 인 경우 등록 시 사용 가능한 서비스 인스턴스가 없습니다).
  • 두 번째 메서드 인수- java.util.Map 유형 또는 java.util.Dictionary 유형이어야 합니다. 이 맵에는 이 서비스 등록과 연결된 서비스 속성이 포함되어 있습니다.
Red Hat logoGithubRedditYoutubeTwitter

자세한 정보

평가판, 구매 및 판매

커뮤니티

Red Hat 문서 정보

Red Hat을 사용하는 고객은 신뢰할 수 있는 콘텐츠가 포함된 제품과 서비스를 통해 혁신하고 목표를 달성할 수 있습니다.

보다 포괄적 수용을 위한 오픈 소스 용어 교체

Red Hat은 코드, 문서, 웹 속성에서 문제가 있는 언어를 교체하기 위해 최선을 다하고 있습니다. 자세한 내용은 다음을 참조하세요.Red Hat 블로그.

Red Hat 소개

Red Hat은 기업이 핵심 데이터 센터에서 네트워크 에지에 이르기까지 플랫폼과 환경 전반에서 더 쉽게 작업할 수 있도록 강화된 솔루션을 제공합니다.

© 2024 Red Hat, Inc.