12.3. 서비스 가져오기

개요

이 섹션에서는 OSGi 서비스 레지스트리로 내보낸 OSGi 서비스에 대한 참조를 가져오고 사용하는 방법을 설명합니다. 참조 요소 또는 reference -list 요소를 사용하여 OSGi 서비스를 가져올 수 있습니다. reference 요소는 상태 비저장 서비스에 액세스하는 데 적합하지만 reference-list 요소는 상태 저장 서비스에 액세스하는 데 적합합니다.

서비스 참조 관리

OSGi 서비스 참조를 가져오기 위한 다음 모델이 지원됩니다.

참조 관리자

참조 관리자 인스턴스는 블루프린트 참조 요소에 의해 생성됩니다. 이 요소는 단일 서비스 참조를 반환하며 상태 비저장 서비스에 액세스하는 데 권장되는 접근 방식입니다. 그림 12.1. “상태 비저장 서비스 참조” 참조 관리자를 사용하여 상태 비저장 서비스에 액세스하기 위한 모델의 개요를 보여줍니다.

그림 12.1. 상태 비저장 서비스 참조

simple svc 01 배포

클라이언트 블루프린트 컨테이너의 빈은 OSGi 서비스 레지스트리의 서비스 오브젝트(지원 서비스 )에서 지원하는 프록시 오브젝트(제공오브젝트)와 함께 삽입됩니다. 이 모델은 다음과 같은 방법으로 상태 비저장 서비스를 서로 바꿔 사용할 수 있다는 사실을 명시적으로 활용합니다.

  • 참조 요소의 기준과 일치하는 여러 서비스 인스턴스가 있는 경우 참조 관리자는 해당 인스턴스 중 하나를 백업 인스턴스로 임의로 선택할 수 있습니다.
  • 백업 서비스가 사라지면 참조 관리자는 동일한 유형의 다른 사용 가능한 서비스 중 하나를 사용하여 즉시 전환할 수 있습니다. 따라서 하나의 메서드 호출에서 다음 방법까지 프록시가 동일한 백업 서비스에 연결된 상태로 유지된다는 보장은 없습니다.

따라서 클라이언트와 백업 서비스 간의 계약은 상태 비저장이므로 클라이언트는 항상 동일한 서비스 인스턴스에 대해 이야기하고 있다고 가정 해서는 안 됩니다. 일치하는 서비스 인스턴스가 없는 경우 프록시는 ServiceUnavailable 예외를 throw하기 전에 특정 시간 동안 기다립니다. 시간 초과는 참조 요소에서 timeout 특성을 설정하여 구성할 수 있습니다.

참조 목록 관리자

참조 목록 관리자 인스턴스는 블루프린트 참조 목록 요소에 의해 생성됩니다. 이 요소는 서비스 참조 목록을 반환하고 상태 저장 서비스에 액세스하는 데 권장되는 접근 방식입니다. 그림 12.2. “상태 저장 서비스에 대한 참조 목록” 참조 목록 관리자를 사용하여 상태 저장 서비스에 액세스하기 위한 모델의 개요를 보여줍니다.

그림 12.2. 상태 저장 서비스에 대한 참조 목록

간단한 svc 02 배포

클라이언트 블루프린트 컨테이너의 빈은 프록시 오브젝트 목록을 포함하는 java.util.List 오브젝트(제공된 오브젝트)와 함께 삽입됩니다. 각 프록시는 OSGi 서비스 레지스트리의 고유한 서비스 인스턴스에서 지원합니다. 상태 비저장 모델과 달리 백업 서비스는 여기에서 서로 바꿔 사용할 수 있는 것으로 간주되지 않습니다. 사실, 목록에 있는 각 프록시의 라이프사이클은 해당 백업 서비스의 라이프사이클과 밀접하게 연결되어 있습니다. 서비스가 OSGi 레지스트리에 등록되면 해당 프록시가 동기적으로 생성되고 프록시 목록에 추가됩니다. 서비스가 OSGi 레지스트리에서 등록 해제되는 경우 해당 프록시는 프록시 목록에서 동시에 제거됩니다.

따라서 프록시와 해당 백업 서비스 간의 계약은 상태 저장 이므로 클라이언트는 특정 프록시에서 메서드를 호출할 때 항상 동일한 백업 서비스와 통신할 때 이를 가정할 수 있습니다. 그러나 백업 서비스를 사용할 수 없게 되어 프록시가 오래될 수 있습니다. 오래된 프록시에서 메서드를 호출하려고 하면 ServiceUnavailable 예외가 생성됩니다.

인터페이스(stateless)로 일치

stateles 서비스 참조를 얻는 가장 간단한 방법은 참조 요소의 interface 특성을 사용하여 일치시킬 인터페이스를 지정하는 것입니다. 인터페이스 특성 값이 서비스의 상위 유형인 경우 또는 특성 값이 서비스에서 구현된 Java 인터페이스인 경우 서비스는 일치하는 것으로 간주됩니다( interface 속성은 Java 클래스 또는 Java 인터페이스를 지정할 수 있음).

예를 들어 상태 비저장 SavingsAccount 서비스( 예 12.1. “단일 인터페이스를 사용한 샘플 서비스 내보내기”참조)를 참조하려면 다음과 같이 참조 요소를 정의합니다.

<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">

  <reference id="savingsRef"
             interface="org.fusesource.example.SavingsAccount"/>

  <bean id="client" class="org.fusesource.example.client.Client">
    <property name="savingsAccount" ref="savingsRef"/>
  </bean>

</blueprint>

참조 요소가 ID를 사용하여 참조 관리자 8080을 생성하는 위치, savingsRef. 참조된 서비스를 사용하려면 다음과 같이 savingsRef 빈을 클라이언트 클래스 중 하나에 삽입합니다.

클라이언트 클래스에 삽입된 useful 속성은 SavingsAccount 에서 할당할 수 있는 모든 유형일 수 있습니다. 예를 들어 다음과 같이 Client 클래스를 정의할 수 있습니다.

package org.fusesource.example.client;

import org.fusesource.example.SavingsAccount;

public class Client {
    SavingsAccount savingsAccount;

    // Bean properties
    public SavingsAccount getSavingsAccount() {
        return savingsAccount;
    }

    public void setSavingsAccount(SavingsAccount savingsAccount) {
        this.savingsAccount = savingsAccount;
    }
    ...
}

인터페이스(상태)로 일치

상태 저장 서비스 참조를 얻는 가장 간단한 방법은 reference-list 요소에서 interface 특성을 사용하여 일치하는 인터페이스를 지정하는 것입니다. 그런 다음 참조 목록 관리자는 인터페이스 속성 값이 서비스의 상위 유형이거나 서비스에서 구현하는 Java 인터페이스인 모든 서비스 목록을 가져옵니다( interface 속성은 Java 클래스 또는 Java 인터페이스를 지정할 수 있음).

예를 들어 상태 저장 SavingsAccount 서비스( 예 12.1. “단일 인터페이스를 사용한 샘플 서비스 내보내기”참조)를 참조하려면 다음과 같이 reference-list 요소를 정의합니다.

<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">

  <reference-list id="savingsListRef"
                  interface="org.fusesource.example.SavingsAccount"/>

  <bean id="client" class="org.fusesource.example.client.Client">
    <property name="savingsAccountList" ref="savingsListRef"/>
  </bean>

</blueprint>

reference-list 요소가 ID를 사용하여 참조 목록 관리자 8080을 생성하는 경우 savingsListRef. 참조된 서비스 목록을 사용하려면 다음과 같이 savingsListRef 빈 참조를 클라이언트 클래스 중 하나에 삽입합니다.

기본적으로 savingsAccountList 8080 속성은 서비스 오브젝트 목록(예: java.util.List<SavingsAccount> )입니다. 클라이언트 클래스를 다음과 같이 정의할 수 있습니다.

package org.fusesource.example.client;

import org.fusesource.example.SavingsAccount;

public class Client {
    java.util.List<SavingsAccount> accountList;

    // Bean properties
    public java.util.List<SavingsAccount> getSavingsAccountList() {
        return accountList;
    }

    public void setSavingsAccountList(
                    java.util.List<SavingsAccount> accountList
    ) {
        this.accountList = accountList;
    }
    ...
}

인터페이스 및 구성 요소 이름으로 일치

상태 비저장 서비스의 인터페이스 및 구성 요소 이름(예: ID)을 모두 일치시키려면 다음과 같이 참조 요소의 interface 속성과 component-name 속성을 모두 지정합니다.

<reference id="savingsRef"
           interface="org.fusesource.example.SavingsAccount"
           component-name="savings"/>

상태 저장 서비스의 인터페이스 및 구성 요소 이름(bean ID)을 모두 일치시키려면 다음과 같이 reference-list 요소에서 interface 속성과 component-name 속성을 모두 지정합니다.

<reference-list id="savingsRef"
           interface="org.fusesource.example.SavingsAccount"
           component-name="savings"/>

필터를 사용하여 서비스 속성 일치

필터에 대해 서비스 속성을 일치시켜 서비스를 선택할 수 있습니다. 필터는 참조 요소 또는 reference -list 요소에 대한 filter 특성을 사용하여 지정됩니다. filter 속성의 값은 LDAP 필터 표현식 이어야 합니다. 예를 들어 bank.name 서비스 속성이 HighStreetBank 와 같은 경우 일치하는 필터를 정의하려면 다음 LDAP 필터 표현식을 사용할 수 있습니다.

(bank.name=HighStreetBank)

두 서비스 속성 값을 일치시키려면 식을 논리 결합한 & amp; 함께 사용할 수 있습니다. 예를 들어 foo 속성이 FooValue 와 같고 bar 속성이 BarValue 와 같도록 하려면 다음 LDAP 필터 표현식을 사용할 수 있습니다.

(&(foo=FooValue)(bar=BarValue))

LDAP 필터 표현식의 전체 구문은 OSGi 코어 사양 의 3.2.7 섹션을 참조하십시오.

필터는 interfacecomponent-name 설정과 결합할 수도 있습니다. 이 경우 지정된 조건이 모두 일치해야 합니다.

예를 들어 SavingsAccount 유형의 상태 비저장 서비스와 high StreetBank 와 같은 bank.name 서비스 속성을 일치시키려면 다음과 같이 참조 요소를 정의할 수 있습니다.

<reference id="savingsRef"
           interface="org.fusesource.example.SavingsAccount"
           filter="(bank.name=HighStreetBank)"/>

SavingsAccount 유형의 상태 저장 서비스와 HighStreetBank 와 같은 bank.name 서비스 속성을 일치시키려면 다음과 같이 참조 목록 요소를 정의할 수 있습니다.

<reference-list id="savingsRef"
           interface="org.fusesource.example.SavingsAccount"
           filter="(bank.name=HighStreetBank)"/>

필수 또는 선택 사항 지정

기본적으로 OSGi 서비스에 대한 참조는 필수라고 가정합니다( 필수 종속 항목참조). 요소에 가용성 특성을 설정하여 참조 요소 또는 참조 목록 요소의 종속성 동작을 사용자 지정할 수 있습니다.

availability 속성의 두 가지 가능한 값이 있습니다.

  • 필수 (기본값)는 일반 블루프린트 컨테이너 초기화 중에 종속성을 해석 해야 함을 의미합니다.
  • 선택 사항 인 에서는 초기화 중에 종속성을 해결할 필요가 없습니다.

다음 참조 요소의 예제에서는 참조 가 필수 종속성임을 명시적으로 선언하는 방법을 보여줍니다.

<reference id="savingsRef"
           interface="org.fusesource.example.SavingsAccount"
           availability="mandatory"/>

참조 리스너 지정

예를 들어 일부 서비스 참조를 선택적 가용성으로 선언한 경우와 같이 OSGi 환경의 동적 특성을 해결하기 위해 백업 서비스가 레지스트리에 바인딩되는 시기와 레지스트리에서 바인딩되지 않는 시기를 추적하는 것이 유용한 경우가 많습니다. 서비스 바인딩 및 바인딩 해제 이벤트의 알림을 수신하려면 reference-listener 요소를 참조 요소 또는 reference -list 요소의 자식으로 정의할 수 있습니다.

예를 들어 다음 블루프린트 구성은 참조 리스너를 ID가 있는 참조 관리자의 자식으로 정의하는 방법을 보여줍니다. savingsRef:

<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">

  <reference id="savingsRef"
             interface="org.fusesource.example.SavingsAccount"
             >
    <reference-listener bind-method="onBind" unbind-method="onUnbind">
      <bean class="org.fusesource.example.client.Listener"/>
    </reference-listener>
  </reference>

  <bean id="client" class="org.fusesource.example.client.Client">
    <property name="savingsAcc" ref="savingsRef"/>
  </bean>

</blueprint>

이전 구성에서는 org.fusesource.example.client.Listener 유형의 인스턴스를 bindunbind 이벤트를 수신 대기하는 콜백으로 등록합니다. savingsRef 참조 관리자의 백업 서비스가 바인딩되거나 바인딩 해제될 때마다 이벤트가 생성됩니다.

다음 예제에서는 Listener 클래스의 예제 구현을 보여줍니다.

package org.fusesource.example.client;

import org.osgi.framework.ServiceReference;

public class Listener {

    public void onBind(ServiceReference ref) {
        System.out.println("Bound service: " + ref);
    }

    public void onUnbind(ServiceReference ref) {
        System.out.println("Unbound service: " + ref);
    }

}

메서드 이름, onBindonUnbind 는 각각 bind-methodunbind-method 속성으로 지정됩니다. 이러한 콜백 방법은 모두 org.osgi.framework.ServiceReference 인수를 사용합니다.