追加したユーザーは T.Yamamoto です。最後に編集したユーザーは T.Yamamotoで、その日時は 2009-12-23 20:07:12 です。

Groovyからサービスを利用する

GroovyのActivatorからOSGiサービスを利用するのは簡単です。次の例では、前の節で作ったサービスを発見し呼び出す方法を示していますが、これは別のサービスにも容易に適用できるでしょう。サービス自体がGroovyで書かれているか、Javaやその他の言語で書かれているかはまったく意識する必要がありません。サービスの実装の詳細は、OSGiモジュールシステムによって完全に隠蔽されているはずです。また、この例はGroovyで書かれてはいますが、Javaで書いた場合とそう大きな違いはありません。

前の節のサービスを利用するためには、Activatorのstart(BundleContext)メソッドでBundleContextからそのサービスを取得する必要があります:

package org.codehaus.groovy.osgi.harness

import org.osgi.framework.BundleActivator import org.osgi.framework.BundleContext import org.osgi.framework.ServiceRegistration import org.osgi.framework.ServiceReference import org.codehaus.groovy.osgi.GroovyGreeter

class HarnessActivator implements BundleActivator {

void start(BundleContext context) { String serviceName = GroovyGreeter.class.name ServiceReference[] references = context.getAllServiceReferences(serviceName, null)

println "${ references ? references.size() : 0 } GroovyGreeter services found."

references?.each { ServiceReference ref -> Object serviceHandle = context.getService(ref) GroovyGreeter service = serviceHandle service.sayHello() } }

void stop(BundleContext context) { } }

サービスはインタフェース名で登録したので、このActivatorは該当インタフェースについて問い合わせを行い、見つかったすべてのプロバイダを出力しています。このActivatorは、名前とパッケージが変更されていることに注意してください。前の例ではorg.codehaus.groovy.osgiをエクスポートしていたので、この例では衝突を避けるために異なるパッケージを選ぶ必要があったのです。なお、このコード例では読みやすさのために変数の型を明示的に宣言しました。

この例をパッケージ化して実行するためには、次のようなレイアウトのJarを作成する必要があるでしょう:

hello-groovy-test-harness.jar
--META-INF
----MANIFEST.MF
--org
----codehaus
------groovy
--------osgi
----------harness
------------HarnessActivator.class
------------HarnessActivator$ start closure1.class

そしてmanifestでは、前の例のorg.codehaus.groovy.osgiをインポートする必要があります:

Manifest-Version: 1.0
Ant-Version: Apache Ant 1.7.0
Created-By: 10.0-b19 (Sun Microsystems Inc.)
Built-By: user
provider: org.codehaus.groovy.osgi.harness
Bundle-ManifestVersion: 2
Bundle-Name: Groovy OSGi Test Harness
Bundle-SymbolicName: org.codehaus.groovy.osgi.harness.hello-groovy-tes
 t-harness
Bundle-Version: 1.0.0
Bundle-Activator: org.codehaus.groovy.osgi.harness.HarnessActivator
Bundle-Vendor: Groovy
Bundle-Localization: plugin
Import-Package: org.codehaus.groovy.runtime.typehandling;version="1.0.
 0",org.codehaus.groovy.osgi;version="1.0.0",groovy.lang;version="1.7.
 0.beta-1-SNAPSHOT",org.codehaus.groovy.reflection;version="1.7.0.beta
 -1-SNAPSHOT",org.codehaus.groovy.runtime;version="1.7.0.beta-1-SNAPSH
 OT",org.codehaus.groovy.runtime.callsite;version="1.7.0.beta-1-SNAPSH
 OT",org.w3c.dom,org.osgi.framework;version="1.3.0"
Bundle-ClassPath: .

OSGiコンソールでこのバンドルをインストールしてテストしましょう。このバンドルをインストールするために、まずgroovy-allバンドルをインストールする必要があります:

osgi> install file:///home/user/dev/groovy-core/src/examples/osgi/../../../target/dist/groovy-all-1.7-beta-1-SNAPSHOT.jar
Bundle id is 6

osgi> install file:///home/user/dev/groovy-core/src/examples/osgi/build/hello-groovy-test-harness.jar Bundle id is 7

osgi> ss

Framework is launched.

id State Bundle 0 ACTIVE org.eclipse.osgi_3.4.0.v20080605-1900 6 INSTALLED groovy-all_1.7.0.beta-1-SNAPSHOT 7 INSTALLED org.codehaus.groovy.osgi.harness.hello-groovy-test-harness_1.0.0

バンドルを起動するためには、groovy-allバンドルが起動されていることと、hello-groovyバンドルがインストールされている必要があります:

osgi> install file:///home/user/dev/groovy-core/src/examples/osgi/build/hello-bundle-imports-groovy.jar
Bundle id is 8

osgi> start 6

osgi> start 7 0 GroovyGreeter services found.

GroovyGreeterサービスを見つけ、起動するには、hello-groovyバンドルを起動してからharnessを再起動してください:

osgi> ss

Framework is launched.

id State Bundle 0 ACTIVE org.eclipse.osgi_3.4.0.v20080605-1900 6 ACTIVE groovy-all_1.7.0.beta-1-SNAPSHOT 7 ACTIVE org.codehaus.groovy.osgi.harness.hello-groovy-test-harness_1.0.0 8 RESOLVED org.codehaus.groovy.osgi.hello-groovy-bundle_1.0.0

osgi> start 8 Groovy BundleActivator started

osgi> stop 7

osgi> start 7 1 GroovyGreeter services found. Hello from the Groovy Greeter!

OSGiコンソールを探検することは価値ある学習体験になるでしょう。すべてのバンドルをロードしたら、"bundle"、"headers"、"services"、"packages"などのコマンドを試してみましょう。"help"と打てばヘルプが利用できます。

子ページ 追加

©2008-2009 grails.jp