BundleActivator와 BundleContext

|
http://blog.naver.com/kittenjun/10126191992

 public interface BundleActivator{

   public void start(BundleContext context) throws Exception;

   public void stop(BundleContext context) throws Exception;

}


BundleActivator 는 OSGi 프레임워크에서 정의한 인터페이스로, 번들 시작/종료 시에 특정한 초기화 작업을 하고 싶은 번들은 꼭 추가해야 하는 객체이다. start와 stop 두개의 메서드르 가지고 있으며, 이 인터페이스를 구현한 객체의 클래스 명을 Manifest의 Bundle-Activator 항목에 지정하면 OSGi가 시작/종료할 때 자동으로 start/stop 메서드를 호출해준다.


start() 메서드가 아무런 예외없이 수행이 되어 종료가 된다면 프레임워크는 이번들이 종료될 때 stop() 메서드가 호출되는 것을 보장해 준다. 만약 start() 메서드 도중에 예외가 발생한다면 stop() 메서드를 거치지 않고 STOPPING 상태를 거쳐서 RESOLVED 상태로 돌아가게 된다.


□ BundleContext

OSGi 프레임워크와 번들을 연결해주는 객체로 OSGi상에서 현재 번들의 컨텍스트 정보를 제어하는 수단이면서, 프레임워크와 연결되는 통로이기도 하다. STARTING 단계에서 프레임워크가 생성되고 액티베이터의 start() 메서드를 호출할 때 전달되어 ACTIVE 단계에서는 계속 사용이 가능하다. 그리고 STOPPING 단계에서 액티베이터의 stop() 메서드에서 리턴된 후 지워진다.


번들컨텍스트는 다음과 같은 용도로 사용될 수 있다.


⊙ 새로운 번들 설치

파일 또는 스트림으로부터 새로운 번들을 설치한다. 


public Bundle installBundle(String location) throws BundleException;

- location 값은 이 번들파일의 위치(JAR 또는 폴더)를 가르킨다.


public Bundle installBundle(String location, InputStream input) throws BundleException;

- location은 단지 번들의 Identity를 표시하는 데만 사용되며, 실제 번들파일의 내용은 인자로 전달받은 InputStream으로 부터 읽어들인다.


⊙ 번들정보 얻어 오기

public Bundle getBundle();

- 전달받은 번들컨텍스트는 자신의 번들 객체와 연결되어 있으므로, getBundle()은 이 번들컨텍스트와 연결된 번들 객체를 리턴한다.


public Bundle getBundle(long id);

- 해당 ID의 번들 객체를 얻어온다.


public Bundle[] getBundles();

- 프레임워크에 설치된 모든 번들 객체를 읽어 온다.


⊙ 서비스 등록하기 및 서비스 가져오기

public ServiceRegisteration registerService(String[] clazzes, Object service, Dictionary properties);

public ServiceRegisteration registerService(String clazz, Object service, Dictionary properties);


public ServiceReference[] getServiceReferences(String clazz, String filter) throws InvalidSyntaxException;

public ServiceReference[] getAllServiceReferences(String clazz, String filter) throws InvalidSyntaxException;


public ServiceReference getServiceReference(String clazz);

public Object getService(ServiceReference reference);

public boolean ungetService(ServiceReference reference);


서비스를 등록하고, 프레임워크에 등록된 모든 서비스 정보를 읽어올 수 있다.


⊙ 프레임워크 이벤트에 Subscribe 또는 Unsubscribe 하기

public void addServiceListener(ServiceListener listener, String filter) throws InvalidSyntaxException;

pbulic void addServiceListener(ServiceListener listener);

public void removeServiceListener(ServiceListener listener);


public void addBundleListener(BundleListener listener);

public void removeBundleListener(BundleListener listener);


public void addFrameworkListener(FrameworkListener listener);

public void removeFrameworkListener(FrameworkListener listener);


OSGi 프레임워크에서는 번들, 서비스 및 프레임워크에 변경이 있을 때 이벤트(Event)를 발생시킨다. 사용자는 이 이벤트에 리스너를 연결함으로써 변경이 있을 때 특정 작업을  수 행하도록 할  수 있다.


⊙ 영구 저장소에 파일 생성하기

public File getDataFile(String filename);

- 일반적으로 번들안에서 생성해서 관리해야 할 데이터 파일을 저장하거나 임시파일을 만드는 데 사용한다. 파일이름을 지정해서 호출하면 영구저장소 폴더에서 파일이름에 해당하는 File 객체를 생성하여 리턴한다.


⊙ 시스템 프로퍼티 읽어오기

public String getProperty(String key);


자바에서 사용하는 프로퍼티를 가져오는 함수, OSGi에서는 org.osgi.framework.Consteants에 아래와 같은 기본 프로퍼티 키를 지정하고 있다. 아래에 있는 값들이 아니라면 시스템 프로퍼티를 검색해서 리턴한다.

- FRAMEWORK_VERSION : OSGi 프레임워크 버전

- FRAMEWORK_VENDOR : 프레임워크의 구현 벤더.

- FRAMEWORK_LANGUAGE : 사용중인 언어

- FRAMEWORK_OS_NAME : 사용중인 OS

- FRAMEWORK_OS_VERSION : 사용중인 OS의 버전

- FRAMEWORK_PROCESSOR : 사용중인 프로세서의 이름


'개발/활용정보 > Java' 카테고리의 다른 글

정규식  (1) 2017.07.05
singleton pattern  (0) 2017.06.29
guava  (0) 2013.08.08
osgi 공부 ^^;;;  (0) 2013.07.10
osgi shell command  (0) 2013.02.21
And