12장. OSGi Services

초록

OSGi 코어 프레임워크는 OSGi 서비스 레지스트리에서 Java 오브젝트를 서비스로 등록하여 번들이 상호 작용할 수 있는 간단한 메커니즘을 제공하는 OSGi 서비스 계층 을 정의합니다. OSGi 서비스 모델의 강점 중 하나는 Java 오브젝트를 서비스로 제공할 수 있다는 것입니다. 서비스 클래스에 적용해야 하는 특정 제약 조건, 상속 규칙 또는 주석이 없습니다. 이 장에서는 OSGi 블루프린트 컨테이너 를 사용하여 OSGi 서비스를 배포하는 방법을 설명합니다.

12.1. 블루프린트 컨테이너

초록

블루프린트 컨테이너는 OSGi 컨테이너와의 상호 작용을 간소화하는 종속성 주입 프레임워크입니다. 블루프린트 컨테이너는 OSGi 서비스 registry-예: OSGi 서비스를 가져오고 내보낼 표준 XML 요소를 제공하는 구성 기반 접근 방식을 지원합니다.

12.1.1. 블루프린트 구성

JAR 파일의 블루프린트 파일의 위치

번들 JAR 파일의 루트와 관련하여 블루프린트 구성 파일의 표준 위치는 다음과 같습니다.

OSGI-INF/blueprint

접미사 .xml .xml 이 있는 모든 파일은 블루프린트 구성 파일로 해석됩니다. 즉, 패턴과 일치하는 모든 파일, OSGI-INF/blueprint/*.xml.xml .xml입니다.

Maven 프로젝트의 블루프린트 파일 위치

Maven 프로젝트 ProjectDir 의 컨텍스트에서 블루프린트 구성 파일의 표준 위치는 다음과 같습니다.

ProjectDir/src/main/resources/OSGI-INF/blueprint

블루프린트 네임스페이스 및 루트 요소

블루프린트 구성 요소는 다음 XML 네임스페이스와 연결됩니다.

http://www.osgi.org/xmlns/blueprint/v1.0.0

블루프린트 구성의 루트 요소는 블루프린트 이므로 블루프린트 XML 구성 파일에는 일반적으로 다음과 같은 개요 형식이 있습니다.

<?xml version="1.0" encoding="UTF-8"?>
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
  ...
</blueprint>
참고

블루프린트 루트 요소에서는 스키마 위치가 블루프린트 프레임워크에 이미 알려져 있기 때문에 xsi:schemaLocation 특성을 사용하여 블루프린트 스키마의 위치를 지정할 필요가 없습니다.

블루프린트 매니페스트 구성

블루프린트 구성의 일부 측면은 JAR의 매니페스트 파일인 META-INF/MANIFEST.MF 의 헤더에 의해 다음과 같이 제어됩니다.

사용자 정의 블루프린트 파일 위치

블루프린트 구성 파일을 비표준 위치(즉, OSGI-INF/blueprint/*.xml이외의 위치)에 배치해야 하는 경우 매니페스트 파일의 Bundle-Blueprint 헤더에 쉼표로 구분된 대체 위치 목록을 지정할 수 있습니다.

Bundle-Blueprint: lib/account.xml, security.bp, cnf/*.xml

필수 종속 항목

OSGi 서비스의 종속 항목은 기본적으로 필수입니다( 참조 요소 또는 참조 목록 요소에서 가용성 속성을 선택 사항으로 설정하여 이 속성을 변경할 수 있음). 종속성을 필수로 선언하면 해당 종속성 및 종속성을 항상 사용할 수 없으면 번들이 제대로 작동할 수 없습니다.

일반적으로 블루프린트 컨테이너는 초기화하는 동안 유예 기간을 통과하며 이 기간 동안 모든 필수 종속성을 해결하려고 시도합니다. 이 시점에서 필수 종속 항목을 확인할 수 없는 경우(기본 제한 시간은 5분), 컨테이너 초기화가 중단되고 번들이 시작되지 않습니다. Bundle-SymbolicName 매니페스트 헤더에 다음 설정을 추가하여 유예 기간을 구성할 수 있습니다.

blueprint.graceperiod
true (기본값)가 활성화되고 블루프린트 컨테이너는 초기화 중에 필수 종속성이 해결될 때까지 기다립니다. false 인 경우 유예 기간을 건너뛰고 컨테이너는 필수 종속성이 해결되었는지 여부를 확인하지 않습니다.
blueprint.timeout
유예 기간(밀리초)을 지정합니다. 기본값은 300000(5분)입니다.

예를 들어 유예 기간이 10초인 경우 매니페스트 파일에 다음 Bundle-SymbolicName 헤더를 정의할 수 있습니다.

Bundle-SymbolicName: org.fusesource.example.osgi-client;
 blueprint.graceperiod:=true;
 blueprint.timeout:= 10000

Bundle-SymbolicName 헤더의 값은 Semi-colon 구분 목록입니다. 여기서 첫 번째 항목은 실제 번들 심볼릭 이름, 두 번째 항목인 블루프린트.graceperiod:=true 에서는 유예 기간을 활성화하고 세 번째 항목인 블루프린트.timeout:= 10000 을 지정합니다.

12.1.2. 서비스 Cryostat 정의

개요

블루프린트 컨테이너를 사용하면 8080 요소를 사용하여 Java 클래스를 인스턴스화할 있습니다. 이러한 방식으로 모든 주요 애플리케이션 오브젝트를 생성할 수 있습니다. 특히 8080 요소를 사용하여 OSGi 서비스 인스턴스를 나타내는 Java 오브젝트를 생성할 수 있습니다.

블루프린트 8080 요소

블루프린트 요소는 블루프린트 스키마 네임스페이스인 http://www.osgi.org/xmlns/blueprint/v1.0.0 에 정의되어 있습니다.

샘플 빈

다음 예제에서는 블루프린트의 8080 요소를 사용하여 몇 가지 다른 유형의 빈을 생성하는 방법을 보여줍니다.

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

  <bean id="label" class="java.lang.String">
    <argument value="LABEL_VALUE"/>
  </bean>

  <bean id="myList" class="java.util.ArrayList">
    <argument type="int" value="10"/>
  </bean>

  <bean id="account" class="org.fusesource.example.Account">
    <property name="accountName" value="john.doe"/>
    <property name="balance" value="10000"/>
  </bean>

</blueprint>

마지막 8080 예제에서 참조하는 Account 클래스를 다음과 같이 정의할 수 있습니다.

package org.fusesource.example;

public class Account
{
    private String accountName;
    private int balance;

    public Account () { }

    public void setAccountName(String name) {
        this.accountName = name;
    }

    public void setBalance(int bal) {
        this.balance = bal;
    }
    ...
}

참고 자료

블루프린트 빈 정의에 대한 자세한 내용은 다음 참조를 참조하십시오.

12.1.3. 속성을 사용하여 블루프린트 구성

개요

이 섹션에서는 Camel 컨텍스트 외부에 있는 파일에 보관된 속성을 사용하여 블루프린트를 구성하는 방법을 설명합니다.

블루프린트 빈 구성

블루프린트 빈은 외부 파일의 속성과 함께 대체할 수 있는 변수를 사용하여 구성할 수 있습니다. ext 네임스페이스를 선언하고 블루프린트 xml에 속성 자리 표시자 pin을 추가해야 합니다. Property-Placeholder Cryostat를 사용하여 속성 파일의 위치를 블루프린트로 선언합니다.

<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
    xmlns:ext="http://aries.apache.org/blueprint/xmlns/blueprint-ext/v1.2.0">

    <ext:property-placeholder>
      <ext:location>file:etc/ldap.properties</ext:location>
    </ext:property-placeholder>
    ...
    <bean ...>
        <property name="myProperty" value="${myProperty}" />
    </bean>
</blueprint>

속성 소유자 구성 옵션의 사양은 http://aries.apache.org/schemas/blueprint-ext/blueprint-ext.xsd 에서 확인할 수 있습니다.