31.4. OSGi 컨테이너에 서비스 게시
31.4.1. 개요
OSGi 컨테이너에 배포되는 애플리케이션을 개발할 때 패키지된 번들 라이프 사이클과 끝점의 게시 및 중지를 조정해야 합니다. 번들이 시작될 때 끝점을 게시하고 번들이 중지되면 끝점을 중지하려고 합니다.
OSGi bundle activator를 구현하여 엔드포인트 라이프사이클을 번들의 라이프 사이클에 연결합니다. bundle activator는 OSGi 컨테이너에서 시작 시 번들에 대한 리소스를 생성하는 데 사용됩니다. 컨테이너는 또한 bundle activator를 사용하여 중지 시 번들 리소스를 정리합니다.
31.4.2. bundle activator 인터페이스
org.osgi.framework.BundleActivator 인터페이스를 구현하여 애플리케이션에 대한 번들 활성화기를 생성합니다. 예 31.4. “Bundle Activator Interface” 에 표시된 BundleActivator 인터페이스에는 구현해야 하는 두 가지 방법이 있습니다.
예 31.4. Bundle Activator Interface
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. 시작 방법 구현
bundle activator의 시작 방법은 끝점을 게시하는 위치입니다. 끝점을 게시하려면 시작 방법을 수행해야 합니다.
-
“서비스 공급자 인스턴스화” 서비스 공급자의
javax.xml.ws.Endpoint
오브젝트입니다. - 서비스 공급자를 게시할 때 사용할 선택적 서버 컨텍스트를 생성합니다.
-
“서비스 공급자 게시”
publish()
방법 중 하나를 사용하는 서비스 공급자입니다.
예 31.5. “Bundle Activator Start Method for Publishing an Endpoint” 서비스 공급자 게시를 위한 코드를 보여줍니다.
예 31.5. Bundle Activator 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. “Bundle Activator Start Method for Publishing an Endpoint” 의 코드는 다음을 수행합니다.
서비스 구현 개체의 사본을 인스턴스화합니다.
서비스 구현을 위해 게시되지 않은 끝점을 생성합니다.
http://localhost:9000/SoapContext/SoapPort 에서 서비스 공급자를 게시합니다.
31.4.4. 중지 방법 구현
bundle activator의 stop 방법은 애플리케이션에서 사용하는 리소스를 정리하는 곳입니다. 구현에는 애플리케이션에서 게시한 모든 엔드포인트를 중지할 수 있는 논리가 포함되어야 합니다.
예 31.6. “Bundle Activator Stop Method for Stopping an Endpoint” 는 게시된 엔드포인트를 중지하는 중지 방법을 보여줍니다.
예 31.6. Bundle Activator 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 actator가 포함되어 있음을 컨테이너에 알려야 합니다. Bundle-Activator
속성을 번들 매니페스트에 추가하여 이 작업을 수행합니다. 이 속성은 번들을 활성화할 때 사용할 번들의 클래스에 대해 지시합니다. 해당 값은 번들 활성화기를 구현하는 클래스의 정규화된 이름입니다.
예 31.7. “Bundle Activator Manifest Entry” com.widgetvendor.osgi.widgetActivator
클래스에서 구현되는 번들의 매니페스트 항목을 표시합니다.
예 31.7. Bundle Activator Manifest Entry
Bundle-Activator: com.widgetvendor.osgi.widgetActivator