31.4. OSGi 컨테이너에 서비스 게시
31.4.1. 개요
OSGi 컨테이너에 배포할 애플리케이션을 개발할 때 패키지된 번들의 라이프사이클을 사용하여 끝점의 게시 및 중지를 조정해야 합니다. 번들이 시작될 때 끝점이 게시되고 번들이 중지될 때 끝점이 중지되도록 합니다.
OSGi 번들 활성화기를 구현하여 엔드포인트 라이프사이클을 번들의 라이프사이클에 연결합니다. 번들 활성화기는 OSGi 컨테이너에서 시작될 때 번들에 대한 리소스를 생성하는 데 사용됩니다. 또한 컨테이너에서는 bundle activator를 사용하여 bundles 리소스를 중지할 때 정리합니다.
31.4.2. 번들 활성화기 인터페이스
org.osgi.framework.BundleActivator 인터페이스를 구현하여 애플리케이션에 대한 번들 활성화기를 생성합니다. 예 31.4. “번들 활성화기 인터페이스” 에 표시된 BundleActivator 인터페이스에는 구현해야 하는 두 가지 방법이 있습니다.
예 31.4. 번들 활성화기 인터페이스
interface BundleActivator { public void start(BundleContext context) throws java.lang.Exception; public void stop(BundleContext context) throws java.lang.Exception; }
start()
메서드는 번들을 시작할 때 컨테이너에서 호출됩니다. 여기에서 끝점을 인스턴스화하고 게시합니다.
stop()
메서드는 번들을 중지할 때 컨테이너에서 호출됩니다. 여기서 끝점을 중지합니다.
31.4.3. 시작 방법 구현
번들 활성화기 시작 방법은 엔드포인트를 게시하는 위치입니다. 끝점을 게시하려면 시작 방법은 다음을 수행해야 합니다.
-
“서비스 공급자 인스턴스화” 서비스 공급자의
javax.xml.ws.Endpoint
오브젝트입니다. - 서비스 공급자를 게시할 때 사용할 선택적 서버 컨텍스트를 생성합니다.
-
“서비스 공급자 게시”
publish()
메서드 중 하나를 사용하는 서비스 공급자입니다.
예 31.5. “bundleivator Start Method for publishing an Endpoint” 서비스 공급자를 게시하기 위한 코드를 표시합니다.
예 31.5. bundleivator Start Method for publishing an Endpoint
package com.widgetvendor.osgi; import javax.xml.ws.Endpoint; import org.osgi.framework.BundleActivator; import org.osgi.framework.BundleContext; public class widgetActivator implements BundleActivator { private Endpoint endpt; ... public void start(BundleContext context) { WidgetOrderImpl impl = new WidgetOrderImpl(); endpt = Endpoint.create(impl); endpt.publish("http://localhost:9000/SoapContext/SoapPort"); } ... }
예 31.5. “bundleivator Start Method for publishing an Endpoint” 의 코드는 다음을 수행합니다.
서비스 구현 오브젝트의 복사본을 인스턴스화합니다.
서비스 구현을 위해 게시되지
않은 끝점을 생성합니다.
http://localhost:9000/SoapContext/SoapPort 에 서비스 공급자를 게시합니다.
31.4.4. 중지 방법 구현
bundle activator의 stop 방법은 애플리케이션에서 사용하는 리소스를 정리하는 것입니다. 해당 구현에는 애플리케이션에서 게시한 모든 엔드포인트를 중지하는 논리가 포함되어야 합니다.
예 31.6. “bundleivator Stop Method for Stopping an Endpoint” 게시된 엔드포인트를 중지하는 중지 방법을 표시합니다.
예 31.6. bundleivator Stop Method for Stopping an Endpoint
package com.widgetvendor.osgi; import javax.xml.ws.Endpoint; import org.osgi.framework.BundleActivator; import org.osgi.framework.BundleContext; public class widgetActivator implements BundleActivator { private Endpoint endpt; ... public void stop(BundleContext context) { endpt.stop(); } ... }
31.4.5. 컨테이너 정보
애플리케이션의 번들에 번들 활성화가 포함되어 있음을 컨테이너에 알려야 합니다. 번들의 매니페스트에 Bundle-Activator
속성을 추가하여 이 작업을 수행합니다. 이 속성은 번들을 활성화할 때 번들에서 사용할 클래스를 컨테이너에 알립니다. 해당 값은 번들 활성화기를 구현하는 클래스의 정규화된 이름입니다.
예 31.7. “bundleivator Manifest Entry” com.widgetvendor.osgi.widgetActivator
클래스로 구현되는 번들의 매니페스트 항목을 표시합니다.
예 31.7. bundleivator Manifest Entry
Bundle-Activator: com.widgetvendor.osgi.widgetActivator