JAVA

[ OSGi ] 5 - Spring DM 2

알 수 없는 사용자 2014. 8. 26. 18:03
728x90



[ OSGi ] 4 - Spring DM 1 에서 Spring 관련 bundle을 올리고 Activator 대신 spring.xml에 설정한 init-method, destory-method 사용을 알아봤다.


여기서는 Spring 을 이용해서 OSGi의 Service에 등록하는 것을 해보겠다. 
( 앞에서도 말했지만 일반적인 Service 등록은 
http://xguru.net/tag/osgi 에서 OSGi 시작하기 4OSGi 사직하기 5 를 참고하자. )




서비스에 등록할 인터페이스 생성

1. interface 생성

HelloWorldOSGiSpringDM  프로젝트에 HelloWorldOSGiSpringDMPrinter.java와 HelloWorldOSGiSpringDMPrinterImpl.java 파일을 생성한다. 



2. code 작성

kr.co.jabsiri.helloworldosgi.springdm.HelloWorldOSGiSpringDMPrinter.java


kr.co.jabsiri.helloworldosgi.springdm.HelloWorldOSGiSpringDMPrinterImpl.java



3. spring.xml 내용 추가



4. MANIFEST.MF 수정

Export-Package: kr.co.jabsiri.helloworldosgi.springdm.service 를 추가하자



등록된 서비스 사용

[ OSGi ] 3 - OSGi plugin 의존 관계 에서 작성한 HelloWorldOSGiSub 프로젝트에서 위에서 작성한 SubActivator.java 에서 helloWorldOSGiSpringDMPrinter 서비스를 호출해 보도록 하자.


1. MANIFEST.MF

Import-Package 부분에 kr.co.jabsiri.helloworldosgi.springdm.service 를 추가한다.


2. 등록된 서비스 사용 

SubActivator.java 에 빨간박스 부분의 코드를 추가하자


이 코드는 서비스로 등록된 내용을 가져와 사용하는 것이다.



배포 & 실행

1. HelloWorldOSGiSpringDM과 sample.HelloWorldOSGiSub 두 프로젝트를 Export 한다. 



2. HelloWorldOSGiSpringDM_1.0.0.jar install 

install file:HelloWorldOSGiSpringDM_1.0.0.jar 로 plugin을 install 시키고 

b 22로 plugin의 상세 정보를 확인하면 밑에 빨간색 부분처럼 HelloWorldOSGiSpringDMPrinter가 서비스에 등록되어 있는 모습을 볼수 있다.


osgi> install file:HelloWorldOSGiSpringDM_1.0.0.jar

Bundle id is 22

Location             file:HelloWorldOSGiSpringDM_1.0.0.jar

State                2

Bundle                  22|Installed  |    1|HelloWorldOSGiSpringDM (1.0.0)

Version              1.0.0

SymbolicName         HelloWorldOSGiSpringDM

BundleContext        null

Module               osgi.identity; osgi.identity="HelloWorldOSGiSpringDM"; type="osgi.bundle"; version:Version="1.0.0" [id=22]

ServicesInUse        null

RegisteredServices   null

BundleId             22

LastModified         1409211674925

Headers               Bundle-ManifestVersion = 2

 Bundle-Name = HelloWorldOSGiSpringDM

 Bundle-RequiredExecutionEnvironment = JavaSE-1.6

 Bundle-SymbolicName = HelloWorldOSGiSpringDM

 Bundle-Version = 1.0.0

 Export-Package = kr.co.jabsiri.helloworldosgi.springdm.service

 Manifest-Version = 1.0 



osgi> start 22

osgi> spring dm start


osgi> b 22

HelloWorldOSGiSpringDM_1.0.0 [22]

  Id=22, Status=ACTIVE      Data Root=C:\develop\OSGi\sample\plugins\configuration\org.eclipse.osgi\22\data

  "Registered Services"

    {kr.co.jabsiri.helloworldosgi.springdm.service.HelloWorldOSGiSpringDMPrinter}={org.springframework.osgi.bean.name=helloWorldOSGiSpringDMPrinter, Bundle-SymbolicName=HelloWorldOS

GiSpringDM, Bundle-Version=1.0.0, service.id=49, service.bundleid=22, service.scope=bundle}

    {org.springframework.osgi.context.DelegatedExecutionOsgiBundleApplicationContext, org.springframework.osgi.context.ConfigurableOsgiBundleApplicationContext, org.springframework.

context.ConfigurableApplicationContext, org.springframework.context.ApplicationContext, org.springframework.context.Lifecycle, java.io.Closeable, org.springframework.beans.factory.L

istableBeanFactory, org.springframework.beans.factory.HierarchicalBeanFactory, org.springframework.context.MessageSource, org.springframework.context.ApplicationEventPublisher, org.

springframework.core.io.support.ResourcePatternResolver, org.springframework.beans.factory.BeanFactory, org.springframework.core.io.ResourceLoader, java.lang.AutoCloseable, org.spri

ngframework.beans.factory.DisposableBean}={org.springframework.context.service.name=HelloWorldOSGiSpringDM, Bundle-SymbolicName=HelloWorldOSGiSpringDM, Bundle-Version=1.0.0, service

.id=50, service.bundleid=22, service.scope=singleton}

  Services in use:

    {org.springframework.beans.factory.xml.NamespaceHandlerResolver}={spring.osgi.core.bundle.id=18, spring.osgi.core.bundle.timestamp=1409042843468, service.id=47, service.bundleid

=19, service.scope=singleton}

    {org.xml.sax.EntityResolver}={spring.osgi.core.bundle.id=18, spring.osgi.core.bundle.timestamp=1409042843468, service.id=48, service.bundleid=19, service.scope=singleton}

    {org.osgi.service.packageadmin.PackageAdmin}={service.ranking=2147483647, service.pid=0.org.eclipse.osgi.internal.framework.legacy.PackageAdminImpl, service.vendor=Eclipse.org -

 Equinox, service.id=11, service.bundleid=0, service.scope=singleton}

  Exported packages

    kr.co.jabsiri.helloworldosgi.springdm.service; version="0.0.0"[exported]

  No imported packages

  No fragment bundles

  No required bundles


3. sample.HelloWorldOSGiSub_1.0.0.jar install

그럼 서비스에 등록된 내용을 사용하는 sample.HelloWorldOSGiSub_1.0.0.jar를 install 해보자


install file:sample.HelloWorldOSGiSub_1.0.0.jar

osgi> install file:sample.HelloWorldOSGiSub_1.0.0.jar

Bundle id is 23

Location             file:sample.HelloWorldOSGiSub_1.0.0.jar

State                2

Bundle                  23|Installed  |    1|sample.HelloWorldOSGiSub (1.0.0)

LastModified         1409212486067

Headers               Bundle-Activator = kr.co.jabsiri.helloworldosgisub.SubActivator

 Bundle-ManifestVersion = 2

 Bundle-Name = HelloWorldOSGiSub

 Bundle-RequiredExecutionEnvironment = JavaSE-1.6

 Bundle-SymbolicName = sample.HelloWorldOSGiSub

 Bundle-Version = 1.0.0

 Import-Package = org.osgi.framework;version="1.3.0",kr.co.jabsiri.helloworldosgi,kr.co.jabsiri.helloworldosgi.springdm.service

 Manifest-Version = 1.0



Version              1.0.0

Module               osgi.identity; osgi.identity="sample.HelloWorldOSGiSub"; type="osgi.bundle"; version:Version="1.0.0" [id=23]

RegisteredServices   null

ServicesInUse        null

BundleContext        null

SymbolicName         sample.HelloWorldOSGiSub

BundleId             23



osgi> start 23

print string : I am sub activator !!!

spring dm service print string : I am sub activator !!!


sample.HelloWorldOSGiSub 에서는 sample.HelloWorldOSGi도 사용하고 있으니 이것도 install을 시킨다.

install file:sample.HelloWorldOSGi_1.0.0.jar

osgi> install file:sample.HelloWorldOSGi_1.0.0.jar

Bundle id is 24

Location             file:sample.HelloWorldOSGi_1.0.0.jar

State                2

Bundle                  24|Installed  |    1|sample.HelloWorldOSGi (1.0.0)

LastModified         1409212573947

Headers               Bundle-Activator = kr.co.jabsiri.helloworldosgi.Activator

 Bundle-ManifestVersion = 2

 Bundle-Name = HelloWorldOSGi

 Bundle-RequiredExecutionEnvironment = JavaSE-1.6

 Bundle-SymbolicName = sample.HelloWorldOSGi

 Bundle-Version = 1.0.0

 Export-Package = kr.co.jabsiri.helloworldosgi

 Import-Package = org.osgi.framework;version="1.3.0"

 Manifest-Version = 1.0



Version              1.0.0

Module               osgi.identity; osgi.identity="sample.HelloWorldOSGi"; type="osgi.bundle"; version:Version="1.0.0" [id=24]

RegisteredServices   null

ServicesInUse        null

BundleContext        null

SymbolicName         sample.HelloWorldOSGi

BundleId             24



그리고 start 23 을 하자 ( 23은 sample.HelloWorldOSGiSub 의 bundle 번호 )

osgi> start 23

print string : I am sub activator !!!

spring dm service print string : I am sub activator !!!

그럼. 위와같이 HelloWorldOSGiSpringDM의 HelloWorldOSGiSpringDMPrinter.java에 정의한 printer method가 실행된 것을 확인한다. 



첨부 1 : HelloWorldOSGi plugin Eclipse Project 

HelloWorldOSGi_5.zip



첨부 2 : OSGi Framework 

plugins_osgi_5.zip


728x90