2009-07-06 7 views
4

サービスを使用するエレガントな方法または OSGiコンテナの間に?RemotingとOSGi

でも可能ですか?

たとえば、ローカルマシンにサービスインターフェイスがあるとします。リモートOSGiコンテナのBundleContextを介してそのサービスインタフェースにアクセスするには、どのような方法論/技術を使用できますか?

答えて

9

リモートサービスと呼ばれるRFC(以前はDistributed OSGi)があります。これは、達成しようとしているものとまったく同じです。 RFCはほぼ完成しており、すでにApache CXFとEclipse ECFによってそれぞれ2つの実装が提供されています。

両方の実装では、OSGiサービスの透過的なリモート処理が可能です。いつものようにOSGiサービスを定義して、それをリモートサービスにするためにいくつかの設定パラメータを追加するだけです。

チェック:
http://cxf.apache.org/distributed-osgi.html

0

可能ですが、これを行うライブラリ(afaik)はありません。私は自分の現在の仕事のために自分自身を転がしました。クライアントとサーバー上のOSGiランタイム、RMIはトランスポートです。私はプロキシオブジェクトの重い使用をしなければなりませんでした。

サービスをサーバーのOSGiランタイム(Equinox)に登録します。私は、このサービスをエクスポートする必要があることを示すプロパティ/属性を探しているすべてのサービス(「リモート可能」=「真」など)を監視するリスナーを持っています。 ServiceTrackerを使用して簡単にフィルタリングできます。 Over RMI私は、クライアントにサービスインタフェースを持つProxyオブジェクトを作成するよう指示します。このプロキシオブジェクトへのすべての呼び出しは、一般にRMI(execService serviceid、メソッド名、var args paramsのような呼び出し)を介して返され、REALサービスで呼び出されます。

私は低レベルの詳細を除外しましたが、おそらくそれを並べ替えることができます。 RMIから逸脱することができる場合は、Rienaを調べることができます(RienaのRMIトランスポートを作成する方法があるかもしれませんが、私は試しても気にしません)

0

あなたの現在の状況はあまり明確ではありません達成しようとしている。あなたはサービスを持っています。あなたはRMIを使ってそれにアクセスすることができ、OSGiサービスとして利用できる必要がありますか?

ローカルマシンサービスへのインターフェイスを書くことができると思います。その後、そのサービスに接続するバンドルを作成し、そのインターフェースをOSGiサービスレジストリに公開することができます。その後、メインバンドルはインターフェイス名またはサービス名を使用してそのサービスを見つけることができます。

ローカルサービスへのRMI接続を取得するのはあまり大変ではありません。おそらく、初期接続を確立するためのいくつかの設定オプション。デカップリングを実現するためにOSGiに公開する前に、サービスのファサードを記述し、それがRMIサービスであるという事実を隠すことが重要です。

しかし、多分私はあなたを完全に誤解していて、これは役に立たないものです。

0

だけでなく、上記のようにCXF、通信フレームワークの集まりであるとOSGi 4.2リモートサービス(別名分散型のOSGi)の早期実施をprovies EclipseのECFは、もあります。これは、クライアントがVMにバインドするローカルサービスを登録し、リモートマシンにプロキシを作成し、選択した技術(RMI、WebServicesなど)を使用してリモートからコールできるようにします。

これは明らかに(サービスが知っておく必要がある)by-valueメソッドの呼び出し構文を使用しますが、それ以外の通信エラーはRuntimeExceptionです。

0

OSGi仕様バージョン4.2の「リモートサービス」の章を参照してください。 複数のOSGiコンテナ間でサービスを配布するための標準的な方法を定義します。

OSGi仕様の新しいバージョン4.3では、これに関するさらに詳細なサポートがあります。第6章「リモートサービス」と「112リモートサービス管理サービス」を参照してください。