2012. 10. 30. 15:25
Middleware, Cloud/OSGi
OSGi Layer에서 최상위에 있는 서비스 Layer는 번들이 서로 동적으로 협동하여 작업할 수 있도록 하는 방법을 제공한다. OSGi의 서비스는 SOA 처럼 구동된다
- Repository에 서비스를 Publish 한다
- 클라이언트는 서비스를 Find 한다
- 서비스가 찾아지면 클라이언트는 Repository와 Bind 된다
서비스의 사용 단계는 Publish -> Find -> Bind 되어 서비스 인터페이스를 통하여 수행된다
▶ OSGi 서비스 등록 및 해지
BundleContext를 통한 등록 API
public ServiceRegistration registerService(String clazz, Object Service, Dictionary properties);
public ServiceRegistration registerService(String[] clazz, Object Service, Dictionary properties);
인자값 의미
- clazz : 해당 서비스 객체의 패키지명 + 인터페이스명, <Interface>.class.getName() 으로 얻어온다
- Service : 인터페이스 구현체, new 로 생성한다
- properties : 서비스 속성, SERVICE_VENDOR (같은 인터페이스 상속시 구분 명칭), SERVICE_RANKING (서비스 호출 우선순위)
서비스 해지
등록시 return 되는 ServiceRegistration 객체의 unregister()를 호출한다. 즉 BundleContext에는 등록된 서비스를 해지하는 API가 없고 return된 ServiceRegistration 객체를 통하여 해지한다
▶ OSGi 서비스 사용하기
BundleContext를 통하여 서비스 찾는 API
public ServiceReference getServiceReference(String interfaceName);
public Object getService(ServiceReference reference);
서비스 객체 얻는 순서
- BundleContext.getServiceReference(<interface>.class.getName())으로 호출하여 ServiceReference 객체를 얻는다
- 다음 BundleContext.getService() 인자값으로 얻어도 ServiceReference 객체를 넘기면 실제 서비스 객체를 얻을 수 있다.
서비스 돌려주기
public void ungetService(ServiceReference reference);
* 동일한 인터페이스를 상속받은 서비스가 있고, 해당 인터페이스를 사용하는 클라이언트가 있다면 서비스 등록시 설정한 properties의 SERVICE_RANKING의 우선순위값에 따라 순서가 정해진다. 우선순위 RANKING이 동일 하다면 OSGi 에 등록된 번들 번호가 작은 것이 먼저 호출된다.
* 클라이언트가 서비스 번들이 등록되었는지 찾기 위해서 Util 성격의 ServiceTracker를 사용하는 것이 좋다. 번들들은 동적으로 운영되므로 클라이언트가 호출하였어도 서비스가 등록되기 전일 수 있으므로 waiting하여 얻어오는 과정을 tracker에 위임한다
* BundleContext API 참조 : http://kickjava.com/src/org/osgi/framework/BundleContext.java.htm
* 참조 샘플 : http://xguru.net/446
'Middleware, Cloud > OSGi' 카테고리의 다른 글
[SpringDM] Dynamic Module 만들기 (0) | 2012.11.10 |
---|---|
[Eclipse Virgo] 사용하기 (0) | 2012.11.03 |
[OSGi] BundleContext에 의한 LifeCycle 관리 (0) | 2012.10.30 |
[OSGi] manifest.mf 파일 설정 (0) | 2012.10.30 |
[OSGi] Felix 설치 사용하기 (0) | 2012.10.29 |