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의 시작 방법은 끝점을 게시하는 위치입니다. 끝점을 게시하려면 시작 방법을 수행해야 합니다.

  1. “서비스 공급자 인스턴스화” 서비스 공급자의 javax.xml.ws.Endpoint 오브젝트입니다.
  2. 서비스 공급자를 게시할 때 사용할 선택적 서버 컨텍스트를 생성합니다.
  3. “서비스 공급자 게시” 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