OSGI入門:サービスを登録する


お帰りなさいEclipseZone OSGiミニシリーズ.やっと、サービスに触れる準備ができました.サービス層はOSGiの最も素晴らしい部分だと思いますので、次の部分は面白いと思います.前回MovieFinderインタフェースの例を見て、MovieListerを使用して映画を検索することについて話しました.実際には、この例は、Martin Fowlerの有名なページからの「依存注入」(依存注入)であり、知られているように「反転制御」(Inversion of Control)またはIoCであると考えられます.IoCを再利用してこの問題を解決しようとした.MovieListerは、元の映画データの出所に特に関心を持っていないので、MovieFinderインタフェースを使用して詳細を隠します.MovieFinderのいずれかの詳細に代わって、データベースを取得したり、Amazon Web Serviceを呼び出したりすることができます.MoiveListerはこのインタフェースに依存しているだけで、任意の具体的な実装ではありません.これまではすべて順調だったが、いくつかの点では、具体的なMovieFinderからMovieListerへの実装を確実にしなければならない.MovieListerを外に呼び出して検索方法を呼び出すよりも、外部のコンテナで適切なオブジェクトを「プッシュ」します.このためこれは反転制御となる.PicoContainer,HiveMind,Spring,さらにはEJB 3のような容器が開発されているものも少なくない.0.しかし、これらの容器には、ほとんどが静的であるという制限があります.MovieFinderがMovieListerを与えると、JVMのライフサイクルに相当します.OSGiもIoCモードを実現することを可能にしたが,動的方法では実現した.MovieFinderのインプリメンテーションをMovieListerに動的に提供し、その後に削除することができます.次に、テキストファイルで映画を検索するアプリケーションから、Amazon Web Servicesを使用してそれらを検索するホットスワップを行うことができます.これがサービス層が手伝ってくれたのです.簡単です.サービスレジスgryにMovieFinderサービスを登録します.その後、MovieListerはそのMovieFinderサービスで提供される.1つのサービスはJavaオブジェクトであるPOJOよりも多くありません.Javaインタフェースの名前の下に登録されています.(POJI?)です.今回は、registryを使用してサービスを登録する方法を見てみましょう.後で、このregistry以外のサービスを入手し、MovieListerを提供する方法を見てみましょう.前回作成したBasicMovieFinderのBundleを追加します.既存のクラスを変更する必要はありません.Bundleのアクターを追加するだけです.したがって、次の世代をコピーします.コードはosgitut/movies/impl/BasicMovieFinder Activatvator.JAvaファイル:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package osgitut.movies.impl;
 
import org.osgi.framework.*;
 
import osgitut.movies.*;
import java.util.Properties;
import java.util.Dictionary;
 
public class BasicMovieFinderActivator implements BundleActivator {
    private ServiceRegistration registration;
 
    public void start(BundleContext context) {
        MovieFinder finder = new BasicMovieFinderImpl();
 
        Dictionary props = new Properties();
        props.put("category", "misc");
 
        registration = context.registerService(
                               MovieFinder.class.getName(),
                               finder, props);
    }
 
    public void stop(BundleContext context) {
        registration.unregister();
    }
}

BasicMovieFinderを置き換えます.mfの内容:
1
2
3
4
5
6
7
8
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Basic Movie Finder
Bundle-SymbolicName: BasicMovieFinder
Bundle-Version: 1.0.0
Bundle-Activator: osgitut.movies.impl.BasicMovieFinderActivator
Import-Package: org.osgi.framework,
 osgitut.movies;version="[1.0.0,2.0.0)"

前回以来、このmanifestに2つの情報が追加されています.1つ目はBundle-Activator行で、フレームワークに私たちのBundleの新しいアクティブ化器について教えています.私たちは前回それを使用しませんでした.同様にorgを追加しましたosgi.frameworkはこれをパッケージにインポートします.私たちのBundleの前のバージョンではフレームワークと対話できないように、このOSGi APIパッケージをインポートする必要はありません.BasicMovieFinderを再構築できますJArファイル:
1
2
> javac -classpath equinox.jar:MoviesInterface.jar osgitut/movies/impl/*.java
> jar cfm BasicMovieFinder.jar BasicMovieFinder.mf osgitut/movies/impl/*.class

OSGiコンソールに戻ると、前回のBasicMovieFinderが表示されます.jarはまだインストールされています.ではupdate Nを入力してOSGiにこのBundleを更新するように伝えるだけで、このNはBundleのデジタルID(あなたがssコマンドで見つけたもの)です.今start Nを使ってBundleを起動します.そして、あなたは...小さなことが起こりました.実際には、OSGi Service Registryで最初のサービスを登録しただけですが、残念ながら「反対側」には誰もいません.したがって、この登録は可視化の影響を与えることはできません.コードが実際に何をしたかを直接保証したい場合は、マイニングを継続し、次のコマンドを使用できます.
1
services (objectClass=*MovieFinder)

次の出力が表示されます.
1
2
3
{osgitut.movies.MovieFinder}={category=misc, service.id=22}
  Registered by bundle: file:BasicMovieFinder.jar [4]
  No bundles using service.

はい、私たちのサービスは登録されています.そして、サービスを検索して他のBundleで使用する方法を教えてあげたいと思っていますが、それは別の日になります.その間、サービスコマンドで何ができるか見てみましょう.最初は式のないサービスを入力することがよくありましたが、その後、それは確かにサービスのフィルタリングによってディスプレイの1つだけを入力することができます.フィルタリングを使用しないと、登録されているすべてのサービスが表示されます.驚くべき巨大な数字がある.