블로그 이미지
Peter Note
Web & LLM FullStacker, Application Architecter, KnowHow Dispenser and Bike Rider

Publication

Category

Recent Post

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

posted by Peter Note