osgi small lab

28
OSG i 動動動動動動 動動動動 動動動 Ching Yi, Chan. aka qrtt1 [email protected]

Upload: ching-yi-chan

Post on 30-Aug-2014

3.445 views

Category:

Education


3 download

DESCRIPTION

 

TRANSCRIPT

Page 1: OSGi Small Lab

OSG i 動態服務模組開發實作詹景逸Ching Yi, Chan. aka [email protected]

Page 2: OSGi Small Lab

Agenda

開發環境準備JDKMavenFelix

練習主題介紹Felix – OSGi Container 的使用Bundle – 建立 OSGi 模組Service – 建立 OSGi 服務

Page 3: OSGi Small Lab

開發環境準備JDK #2

Java SEhttp://java.sun.com/javase/downloads/index.jsp

檢查環境變數JAVA_HOMECLASSPATHPATH

Page 4: OSGi Small Lab

開發環境準備 Maven #3

取得檔案http://maven.apache.org/download.html

解壓縮 ~/app c:\app

修改 PATH 變數 export PATH=$PATH:~/app/apache-maven-x.y.z/bin set PATH=%PATH%;c:\app\apache-maven-x.y.z\bin

執行測試mvn -v

Page 5: OSGi Small Lab

開發環境準備 Felix – OSGi Container #5

取得檔案http://apache.stu.edu.tw/felix/felix-1.4.1.zip

解壓縮 ~/app c:\app

啟動 Felixjava -jar bin/felix.jar

停止 Felixstop 0 或是 shutdown

Page 6: OSGi Small Lab

Felix 基本操作啟動 Felix #6

java -jar bin/felix.jar常用指令

help ps – 列出已安裝 Bundleinstall – 安裝 Bundlestart – 啟動 Bundlestop – 停止 Bundleupdate – 更新 Bundle uninstall – 移除 Bundle ( 請先別執行 )shutdown – 離開 felix

Page 7: OSGi Small Lab

PART 1

Everything is

Bundle

Page 8: OSGi Small Lab

安裝 Bundle File Install Bundle #7

功能:在 Felix 執行目錄下建立 load 資料夾。定期監看 load 資料夾的檔案,若是 OSGi Bundle 就自動安裝。使用 Install 指令安裝 Bundle

透過網路檔案安裝透過檔案系統安裝

測試 File Install Bundle ( 需先啟動 Bundle)複製 hello.service-1.0.0.jar 至 load 資料夾

install http://apache.ntu.edu.tw/felix/org.apache.felix.fileinstall-0.9.0.jar

install file:///c:/temp/org.apache.felix.fileinstall-0.9.0.jarinstall file:///home/qrtt1/temp/org.apache.felix.fileinstall-0.9.0.jar

Page 9: OSGi Small Lab

建立 Bundle

使用 Maven 建立新的專案 #9for unix-like

for windows

mvn archetype:create \-Dversion=1.0.0 \-DgroupId=javatwo2009 \-DartifactId=hello.bundle

mvn archetype:create ^-Dversion=1.0.0 ^-DgroupId=javatwo2009 ^-DartifactId=hello.bundle

Page 10: OSGi Small Lab

Maven 專案導覽專案目錄 #9

Artifact 名稱hello.bundle

編譯並打包專案 ( 請先執行這個步驟 )cd hello.bundlemvn clean package

Page 11: OSGi Small Lab

使用 Maven-Bundle-Plugin (1)

修改 pom.xml 檔案 #10改變 <packaging /> 為 bundle增加 OSGi Framework 的 Dependency

設定 Maven-Bundle-Plugin ( 接續下頁 )

<dependency><groupId>org.apache.felix</groupId><artifactId>org.osgi.core</artifactId><version>1.0.0</version>

</dependency>

Page 12: OSGi Small Lab

<build> <plugins> <plugin> <groupId>org.apache.felix</groupId> <artifactId>maven-bundle-plugin</artifactId> <extensions>true</extensions> <configuration> <instructions> <Export-Package>${pom.groupId}</Export-Package> <Bundle-SymbolicName>${pom.artifactId}</Bundle-SymbolicName> <Bundle-Activator>${pom.groupId}.Activator</Bundle-Activator> </instructions> </configuration> </plugin> </plugins></build>

使用 Maven-Bundle-Plugin (2)

Manifest-Version: 1.0Export-Package: javatwo2009;uses:="org.osgi.framework"Built-By: AdministratorTool: Bnd-0.0.308Bundle-Name: hello.bundleCreated-By: Apache Maven Bundle PluginBundle-Version: 1.0.0Build-Jdk: 1.6.0_06Bnd-LastModified: 1235833008625Bundle-ManifestVersion: 2Bundle-Activator: javatwo2009.ActivatorImport-Package: javatwo2009,org.osgi.framework;version="1.3"Bundle-SymbolicName: hello.bundle

Page 13: OSGi Small Lab

建立 Bundle Activatorpackage javatwo2009;

import org.osgi.framework.BundleActivator;import org.osgi.framework.BundleContext;

/** * Hello world!*/public class Activator implements BundleActivator { public void start(BundleContext context) throws Exception { System.out.println("Hey!"); } public void stop(BundleContext context) throws Exception { System.out.println("Bye!"); }}

#12 .. #13

Page 14: OSGi Small Lab

編譯與安裝 bundle

使用 Maven 編譯並打包專案 #14 mvn clean package

安裝 bundle將 target/hello.bundle-1.0.0.jar 複製到 FELI

X_HOME/load 資料夾

Page 15: OSGi Small Lab

OSGi 怎麼跑?

JVMOSGi Framework

Module

Life Cycle

Service

System Bundle B B B

PID 永遠為0

Page 16: OSGi Small Lab

Installed

OSGi 怎麼跑?

JVMOSGi Framework

System Bundle

MODULE

Export-Package: org.osgi.framework, org.osgi.framework.hooks.service,org.osgi.service.packageadmin,org.osgi.service.startlevel,org.osgi.service.url,org.osgi.util.tracker

Resolving & Loading Classes

Resolved

Page 17: OSGi Small Lab

OSGi 怎麼跑?

JVMOSGi Framework

System Bundle

LIFE

CYCLE

Resolved

Starting Active

Stopping

Activator.stop()

Activator.start()

Page 18: OSGi Small Lab

PART 2

Service is

Everything

Page 19: OSGi Small Lab

OSGi Service 在哪裡?

JVMOSGi Framework

Bundle

Activator

Bundle

Activator

Bundle

Activator

SERVICE REGISTRY

publish publish publish

find & bind find & bind find & bindunpublish unpublish

unpublish

Page 20: OSGi Small Lab

服務與實作角色 (1)

Service Provider Interface , SPI #16

Bundle

Activator Export-Package

Page 21: OSGi Small Lab

服務與實作角色 (2)

Application Programming Interface , API

Bundle

ActivatorImport-Package

Page 22: OSGi Small Lab

服務與實作角色 (3)

Service Provider

Bundle

ActivatorImport-Package

ServiceRegistration registration = bundleContext.registerService( ServiceA.class.getName(), new ConcreteServiceA(), prop);

Page 23: OSGi Small Lab

服務與實作角色 (4)

Service Consumer

Bundle

ActivatorImport-Package

ServiceReference ref = bundleContext .getServiceReference(ServiceA.class.getName());

ServiceA service = (ServiceA) bundleContext.getService(ref);

Page 24: OSGi Small Lab

Apache Felix Shell ServiceActivator

Apache Felix Shell TUIActivator

Tinyurl CommandActivator

實作 TinyURL Command(1)

擴充 Felix Shell 指令

Page 25: OSGi Small Lab

Apache Felix Shell ServiceActivator

Apache Felix Shell TUIActivator

Tinyurl CommandActivator

實作 TinyURL Command(2)

org.apache.felix.shellExport-Package

Import-Package

Page 26: OSGi Small Lab

Apache Felix Shell ServiceActivator

Apache Felix Shell TUIActivator

Tinyurl CommandActivator

實作 TinyURL Command(3)

publish

publish

追蹤 Command 服務加入新增的 Command 服務

使用 ShellService 擁有的 Command

Page 27: OSGi Small Lab

動手做看看實作 TinyurlCommand 替 Felix 增加指令

See TODO 2 & #17..#21 tinyurl http://very_long_url.com.tw

Page 28: OSGi Small Lab

詹景逸Ching Yi, Chan. aka [email protected]

Thank You