블로그 이미지
윤영식
Full Stacker, 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 윤영식
2012. 10. 30. 14:20 Middleware, Cloud/OSGi

Bundle은 BundleContext에 의한 생명주기 관리가 이루어진다. 기본적으로 BundleContext 객체는 Bundle이 생성될 때 인자로 전달이 된다. 또한 OSGi 프레임워크와의 연결 통로이다. BundleContext는 OSGi Layer에서 LifeCycle Layer를 담당한다.



▶ BundleContext의 하는 일


  - OSGi에 새로운 번들 설치

  - OSGi에 설치된 다른 번들 리스트 및 정보 읽어오기

  - OSGi에 등록된 서비스 리스트 및 서비스 객체 가져오기

  - 서비스나 번들의 변경에 대한 이벤트 Listening  


결국 BundleContext가 번들에 대한 LifeCycle 관리 및 번들의 의존관계 설정에 따른 타 번들의 참조값을 BundleContext끼리 공유하여 가져온다


▶ Bundle의 LifeCycle

  1) OSGi 를 구동하여 shell 환경으로 들어가면 번들 jar 파일을 설치->시작->활성->정지->삭제등의 작업을 할 수 있다. 



  2) install file:c:/temp/testbundle.jar 파일 명령 : INSTALLED 상태가 된다
번들의 manifest 오류들을 점검 한다 

  3) resolve <bundle number> : RESOLVED 상태가 된다 
번들의 Export / Import를 연결해 주는 단계,  resolving 상태에서 문제가 발생하면 diag 명령을 내려서 원인을 찾는다

  4) start <bundle number> : STARTING->ACTIVE 상태가 된다
BundleActivator.start(BundleContext)가 호출된다. 문제 발생시 다시 RESOLVED 상태로 돌아 간다
start 안에는 많은 시간이 소요되는 작업을 해서는 안되고 있다면 별도의 스레드로 진행한다 

  5) stop <bundle number> : STOPPING->RESOLVED 상태가 된다
BundleActivator.stop(BundleContext)가 호출된다. stop()을 호출하면 만들어 놓은 스레드나 서비스를 종료 해지해야 한다. 따라서 stop 호출시 사용한 스레드, 서비스들을 종료하는 코드를 넣는다.   

  6) uninstall <bundle number> : RESOLVED-> UNINSTALLED 상태가 되고 ss(Equinox 기준) 또는 lb (felix 기준) 명령으로 보면 bundle 명칭이 나오지 않는다. 번들이 삭제된 것임 
번들이 완전 제거 되는 것임. OSGi 목록에서 나타나지 않는다 


LifeCycel의 상태 변이 흐름에 따라 명령어도 동일함을 알 수 있다.  OSGi 미들웨어의 재구동없이 번들을 만들고 적용시키는 것이 가능함을 알 수 있다.


'Middleware, Cloud > OSGi' 카테고리의 다른 글

[Eclipse Virgo] 사용하기  (0) 2012.11.03
[OSGi] 서비스 Layer 만들기  (0) 2012.10.30
[OSGi] manifest.mf 파일 설정  (0) 2012.10.30
[OSGi] Felix 설치 사용하기  (0) 2012.10.29
[OSGi] 이론-1  (0) 2012.10.27
posted by 윤영식
2012. 10. 30. 13:51 Middleware, Cloud/OSGi

OSGi 번들은 jar 파일로 패키징이 되고 안에 META-INF/manifest.mf 파일이 존재해야 한다. 해당 파일에는 번들의 명칭, 버전, 의존관계, 정책등이 기술된다. manifest.mf 파일 만들기는 OSGi Layer에서 Module Layer의 모듈 즉, 번들을 만들기 위한 중요 부분이다.


Name: Value 방식으로 서술이 된다. 

일반적인 기술 방법은 http://blog.naver.com/PostView.nhn?blogId=kittenjun&logNo=10126086035 사이트를 참조한다. 


중요하게 생각되는 항목은


  - BundleActivator를 상속받아 구현한 클래스 지정하는 Bundle-Activator

  - OSGi에 노출되는 외부명칭 Bundle-Name, 내부 키명칭 Bundle-SymbolicName

  - 번들 버전 Bundle-Version 

  - 외부 Bundle을 사용한다면 Import-Package


정도는 기본적으로 알아두어야 겠다

주의 : manifest.mf 파일 맨뒤에는 CR(Carriage Return)과 같이 Line Break 종료되어야 한다. 따라서 파일 맨 마지막에 빈 공백의 라인을 의무적으로 넣는다. 작성하고 Enter키 두번 누른다. 맨 마지막 줄에 빈 공백 라인이 없으면 Activator 인식 오류가 발생할 수도 있다. 


'Middleware, Cloud > OSGi' 카테고리의 다른 글

[Eclipse Virgo] 사용하기  (0) 2012.11.03
[OSGi] 서비스 Layer 만들기  (0) 2012.10.30
[OSGi] BundleContext에 의한 LifeCycle 관리  (0) 2012.10.30
[OSGi] Felix 설치 사용하기  (0) 2012.10.29
[OSGi] 이론-1  (0) 2012.10.27
posted by 윤영식
2012. 10. 30. 11:46 Dev Environment/Sublime Text

Node.js 교육시간 처음에 설치한 것이 Sublime text 2이다. Eclipse 기반은 아무래도 무겁고, 그와 준하는 개발환경을 가지고 JavaScript 서버사이드 개발을 하고 싶을 경우 Sublime text 2를 설치한다. 설치후 패키지 설치 및 환경 설정을 보도록 하자 



1. Sublime Text 2 설치하기 


http://www.sublimetext.com/2  사이트에서 환경에 맞는 인스톨 패키지를 다운로드 받아서 설치한다. 유료 라이센스이지만 등록하지 않아도 왠만한 개발관련 (JavaScript, Node.js, Java...) 부분은 자유로이 사용할 수 있다. 



2. Sublime text package control 설치하기 


package control은 sublime text에 plugin 을 찾고, 설치를 쉽게 할 수 있도록 해준다. 

http://wbond.net/sublime_packages/package_control/installation  사이트로 가면 다음과 같은 설치 문구가 나온다


> sublime text 2 를 실행하고 ctrl + `  short key를 누른다



> 박스안에 있는 문구를 copy한다

import urllib2,os; pf='Package Control.sublime-package'; ipp=sublime.installed_packages_path(); os.makedirs(ipp) if not os.path.exists(ipp) else None; urllib2.install_opener(urllib2.build_opener(urllib2.ProxyHandler())); open(os.path.join(ipp,pf),'wb').write(urllib2.urlopen('http://sublime.wbond.net/'+pf.replace(' ','%20')).read()); print('Please restart Sublime Text to finish installation')



> sublime text의 command line에 paste 하고 enter를 치면 install 된다 


> ctrl + shift + p short key를 누르면 plugin을 설치 할 수 있는 창이 뜬다


> install package 라고 치면 팝업창 하단이 바뀌고 선택되면 enter 또는 click을 한다 


> install package를 들어 갔다면 java라고 치면 관련 package가 나오고 선택하면 github에서 다운로드하여 자동 설치한다




3. Sublime text Tips


short key 

> ctrl + `  : 하단에 command 입력창 나옴 

> ctrl + shift + p : find 팝업창

> ctrl + p : 문서내 find 팝업창 (줄번호 찾아가기  :<line number>  ex) :13   13번줄로 이동)

> alt + shift + 1~9 : 컬럼창 분할  (View - Layout 메뉴)

> ctrl + a : 전체 선택,  ctrl + L : 라인 선택

> ctrl + shift + up/down key : line swap (Edit - Line 메뉴)

> ctrl + F2 : 문서내 bookmark 표기 이동은 F2 누르면 위에서 아래로 이동 (Goto - Bookmark 메뉴)

> 참조 사이트 : http://juhoi.tistory.com/51



어제 처음 써보지만 plugin 들을 github에서 바로 다운로드 받아서 설치해 주고, eclipse와 같은 기능들을 사용할 수 있어서 Text기반의 개발을 할때 그리고 로컬 컴퓨터 사양이 떨어질 때 쉽고 빠르게 사용할 수 있는 개발툴로 안성맞춤으로 보인다. Node.js 기반 개발 할 때는 이걸 사용해 보자

posted by 윤영식
2012. 10. 29. 16:15 Middleware, Cloud/OSGi

OSGi 프레임워크중 r4를 구현한 Felix를 설치하고 간단히 구현한 번들을 어떻게 올려서 사용할 수 있는지 보자. 


▶ 테스트 환경


  - Felix를 local PC에 설치하고 구동한다  (Felix가 OSGi 프레임워크라고 하지만 사실은 기능이 아무것도 없고 필요한 기능을 구현한 번들을 운영 관리해 주는 미들웨어-Middelware-라고 보면 된다)

  - Jetty 엔진 번들을 Felix 프레임워크에 올린다(start). 

  - Test용 Http Servlet 호출 프로그램을 짜고 번들로 만든다 (TestServlet 번들)

  - TestServlet 번들을 Felix에 올린다(start)

  - 브라우져에서 TestServlet을 호출해 본다. 


결국 아무 기능이 없는 Felix OSGi 미들웨어 위에 HTTP Servlet Engine인 Jetty를 올리고, Servlet을 개발하여 올리면 Client에게 서비스를 제공할 수 있게된다. 


▶ 환경 구축하고 테스트


  1) Felix (http://felix.apache.org/site/downloads.cgi) 에서 main framework 을 다운로드 한다

  2) 다운로드 zip 파일을 적당 위치에 푼다 (이전에 JDK 설치는 필수)
   

  3) 디렉토리 위치에 felix.bat 파일을 만든다  (bat 내용 :  java -classpath ./bin/felix.jar org.apache.felix.main.Main )    

    

  4) cmd 창을 띄워서 felix.bat 을 실행하고, lb 명령을 수행하면 현재 기본 Activate된 번들 정보가 나온다 (help 다른명령보기)

   

  5) felix에는 shell과 repository 번들이 bundle 디렉토리에 존재한다.

    

  6) 다른 번들을 auto deploy하기 위하여 conf/config.properties에서 #felix.auto.deploy.dir=bundle 로 되어있는 주석 #을 제거한다. 그리고 bundle디렉토리에 다운로드 받은 번들 jar 파일을 놓고 felix를 재시작하면 자동 activate된다.


  7) 수동 active 방법 : install xxx.jar   -->  start <번들No.> 

   

  8) felix를 일단 시작하면 기존 active된 상태 정보들은 felix-cache디렉토리에 영구저장된다. (번들 activate 상태정보를 완전 제거하고, felix를 초기화 하고 싶다면 해당 디렉토리를 삭제하면 된다)

  

  9) http://felix.apache.org/site/downloads.cgi 사이트에서 HTTP 관련 subproject 번들을 다운로드 받아서 로컬의 <felix 홈>/bundle 디렉토리에 copy한다


  

  10) felix를 재시작하면 jetty가 8080 port로 Listening을 한다 (포트 변경은 jetty bundle 압축을 풀고, metatype.xml 에 정의된 port 수정후 재 배포한다

 

  11) http://localhost:8080/ 을 호출해 보면 jetty 404 에러가 보이면 정상이다. (왜? 아무런 서비스도 올리지 않고 단지 jetty servlet engine만 기동 되었기 때문이다)
 

  12) 테스트 번들 만들기는 다음 블로그에서 소개하기로 하고 첨부된 httptest.jar 를 특정 디렉토리에 복사한다. 

  

  13) felix 위에 activate 시켜보자. 여기선 bundle 디렉토리에 파일을 놓고 felix를 restart함으로써 auto deploy 말고 수동으로 바로 activate 시켜본다 ( felix:install file:<directory> , 주의 : 윈도우 구분자는 \\ 두개 삽입하고 전체경로 지정 )

  

  14) http://localhost:8080/servlet1/MyMusicCollection  을 호출한다

  

  15) counting crows 입력값을 넣고 submit 하면 jetty가 해당 요청을 받아서 test servlet으로 요청처리를 보내고 결과를 반환한다

 


결국 OSGi 프레임워크는 필요한 기능이나 서비스를 번들로 만들어서 각 기능을 이용할 수 있게 해주는 미들웨어라고 볼 수 있다.


'Middleware, Cloud > OSGi' 카테고리의 다른 글

[Eclipse Virgo] 사용하기  (0) 2012.11.03
[OSGi] 서비스 Layer 만들기  (0) 2012.10.30
[OSGi] BundleContext에 의한 LifeCycle 관리  (0) 2012.10.30
[OSGi] manifest.mf 파일 설정  (0) 2012.10.30
[OSGi] 이론-1  (0) 2012.10.27
posted by 윤영식