12.5. OSGi 서비스 액세스
12.5.1. 개요
이 섹션에서는 OSGi 컨테이너에 간단한 OSGi 클라이언트를 생성, 빌드 및 배포하는 방법을 설명합니다. 클라이언트는 OSGi 레지스트리에서 간단한 Hello World 서비스를 찾고 sayHello()
메서드를 호출합니다.
12.5.2. 사전 요구 사항
Maven 빠른 시작 archetype을 사용하여 프로젝트를 생성하려면 다음과 같은 사전 요구 사항이 있어야 합니다.
- Maven 설치-Maven은 Apache의 무료 오픈 소스 빌드 툴입니다. http://maven.apache.org/download.html 에서 최신 버전을 다운로드할 수 있습니다(최소 버전 2.0.9).
- 인터넷 연결- 빌드를 수행하는whilst, Maven은 외부 리포지토리를 동적으로 검색하고 즉시 필요한 아티팩트를 다운로드합니다. 이 기능이 작동하려면 빌드 머신이 인터넷에 연결되어 있어야 합니다.
12.5.3. Maven 프로젝트 생성
maven-archetype-quickstart
archetype은 일반 Maven 프로젝트를 생성한 다음 원하는 목적에 맞게 사용자 지정할 수 있습니다. 좌표를 사용하여 Maven 프로젝트를 생성하려면 org.fusesource.example:osgi-client
를 입력합니다.
mvn archetype:create -DarchetypeArtifactId=maven-archetype-quickstart -DgroupId=org.fusesource.example -DartifactId=osgi-client
이 명령의 결과는 생성된 프로젝트의 파일이 포함된 ProjectDir/osgi-client
디렉터리입니다.
기존 제품의 그룹 ID와 충돌하는 아티팩트의 그룹 ID를 선택하지 않도록 주의하십시오! 이로 인해 프로젝트의 패키지와 기존 제품의 패키지가 충돌할 수 있습니다(일반적으로 프로젝트 Java 패키지 이름의 루트로 그룹 ID가 사용되므로).
12.5.4. POM 파일 사용자 정의
다음과 같이 OSGi 번들을 생성하려면 POM 파일을 사용자 지정해야 합니다.
- 5.1절. “번들 프로젝트 생성” 에 설명된 POM 사용자 지정 단계를 따르십시오.
클라이언트는 osgi-service 번들에 정의된
HelloWorldSvc
Java 인터페이스를 사용하므로osgi-service
osgi-service
번들의 Maven 조정이org.fusesource.example:osgi-service:1.0-SNAPSHOT
이라고 가정하면 클라이언트의 POM 파일에 다음 종속성을 추가해야 합니다.<project ... > ... <dependencies> ... <dependency> <groupId>org.fusesource.example</groupId> <artifactId>osgi-service</artifactId> <version>1.0-SNAPSHOT</version> </dependency> </dependencies> ... </project>
12.5.5. 블루프린트 파일 작성
클라이언트 프로젝트에 블루프린트 파일을 추가하려면 먼저 다음 하위 디렉터리를 생성합니다.
ProjectDir/osgi-client/src/main/resources ProjectDir/osgi-client/src/main/resources/OSGI-INF ProjectDir/osgi-client/src/main/resources/OSGI-INF/blueprint
ProjectDir/osgi-client/src/main/resources/OSGI-INF/blueprint
디렉터리 아래에서 원하는 텍스트 편집기를 사용하여 config.xml
을 생성하고 예 12.6. “서비스 가져오기를 위한 블루프린트 파일” 에서 XML 코드를 추가합니다.
예 12.6. 서비스 가져오기를 위한 블루프린트 파일
<?xml version="1.0" encoding="UTF-8"?> <blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"> <reference id="helloWorld" interface="org.fusesource.example.service.HelloWorldSvc"/> <bean id="client" class="org.fusesource.example.client.Client" init-method="init"> <property name="helloWorldSvc" ref="helloWorld"/> </bean> </blueprint>
여기서 reference
요소는 OSGi 레지스트리에서 HelloWorldSvc
유형의 서비스를 찾는 참조 관리자를 생성합니다. Cryo
stat 요소는 Client
클래스의 인스턴스를 생성하고 서비스 참조를 8080 속성 helloWorldSvc
로 삽입합니다. 또한 init-method
속성은 빈 초기화 단계에서 Client.init()
메서드가 호출되도록 지정합니다(즉, 서비스 참조가 클라이언트사이에 삽입된 후 ).
12.5.6. 클라이언트 클래스 작성
ProjectDir/osgi-client/src/main/java/org/fusesource/example/client
디렉터리 아래의 텍스트 편집기를 사용하여 파일을 생성하고, Client.java
에서 Java 코드를 추가합니다. 예 12.7. “클라이언트 클래스”
예 12.7. 클라이언트 클래스
package org.fusesource.example.client; import org.fusesource.example.service.HelloWorldSvc; public class Client { HelloWorldSvc helloWorldSvc; // Bean properties public HelloWorldSvc getHelloWorldSvc() { return helloWorldSvc; } public void setHelloWorldSvc(HelloWorldSvc helloWorldSvc) { this.helloWorldSvc = helloWorldSvc; } public void init() { System.out.println("OSGi client started."); if (helloWorldSvc != null) { System.out.println("Calling sayHello()"); helloWorldSvc.sayHello(); // Invoke the OSGi service! } } }
클라이언트
클래스는 삽입을 통해 Hello World 서비스에 대한 참조를 수신할 수 있는 helloWorldSvc
8080 속성에 대한 getter 및 setter 메서드를 정의합니다. init()
메서드는 속성 삽입 후 8080 초기화 단계에서 호출되므로 일반적으로 이 메서드 범위 내에서 Hello World 서비스를 호출할 수 있습니다.
12.5.7. 클라이언트 번들 실행
osgi-client
프로젝트를 설치하고 실행하려면 다음 단계를 수행합니다.
프로젝트 빌드- 명령 프롬프트를 열고 디렉터리를
ProjectDir/osgi-client
로 변경합니다. Maven을 사용하여 다음 명령을 입력하여 데모를 빌드합니다.mvn install
이 명령이 성공적으로 실행되면
ProjectDir/osgi-client/target
디렉터리에 번들 파일osgi-client-1.0-SNAPSHOT.jar
.osgi-service 번들을 설치하고 시작합니다. Red Hat Fuse 콘솔에서 다음 명령을 입력합니다.
karaf@root()> bundle:install -s file:ProjectDir/osgi-client/target/osgi-client-1.0-SNAPSHOT.jar
여기서 ProjectDir 은 Maven 프로젝트를 포함하는 디렉터리이며
-s
플래그는 즉시 번들을 시작하도록 컨테이너를 지시합니다. 예를 들어 프로젝트 디렉터리가 Windows 머신의C:\Projects
인 경우 다음 명령을 입력합니다.karaf@root()> bundle:install -s file:C:/Projects/osgi-client/target/osgi-client-1.0-SNAPSHOT.jar
참고Windows 머신에서 파일 URL을 포맷하는 방법을 주의하십시오.
파일
클라이언트 출력- 클라이언트 번들이 성공적으로 시작되면 콘솔에 다음과 같은 출력이 즉시 표시됩니다.
Bundle ID: 239 OSGi client started. Calling sayHello() Hello World!