OSGiコンテナー間またはOSGiコンテナー間でサービスを使用するためのエレガントな方法はありますか?
それも可能ですか?
たとえば、ローカルマシンにサービスインターフェイスがあるとします。リモートOSGiコンテナーのBundleContextを介してそのサービス・インターフェースにアクセスできるようにするために、どのような方法論/テクノロジーを使用できますか?
OSGiコンテナー間またはOSGiコンテナー間でサービスを使用するためのエレガントな方法はありますか?
それも可能ですか?
たとえば、ローカルマシンにサービスインターフェイスがあるとします。リモートOSGiコンテナーのBundleContextを介してそのサービス・インターフェースにアクセスできるようにするために、どのような方法論/テクノロジーを使用できますか?
リモートサービス(以前のDistributed OSGi)と呼ばれるRFCがあり、これはまさにあなたが達成しようとしていることを実行します。RFCはほぼ完成しており、ApacheCXFとEclipseECFによってそれぞれ2つの実装がすでに提供されています。
どちらの実装でも、OSGiサービスの透過的なリモーティングを実行できます。通常どおりOSGiサービスを定義し、いくつかの構成パラメーターを追加してリモートサービスにする必要があります。
可能ですが、これを行うライブラリ(afaik)はありません。私は自分の現在の仕事のために自分自身を転がしました。クライアントとサーバー上のOSGiランタイム、RMIはトランスポートです。プロキシオブジェクトを多用する必要がありました。
サーバーのOSGiランタイム(Equinox)にサービスを登録します。「remotable=true」のように、このサービスをエクスポート(リモート化)する必要があることを示すプロパティ/属性を探しているすべてのサービスを監視するリスナーがいます。ServiceTrackerを使用してフィルタリングするのは簡単です。RMIを介して、サービスインターフェイスを使用してプロキシオブジェクトを作成するようにクライアントに指示します。このプロキシオブジェクトへのすべての呼び出しは、一般的にRMIを介して返送され(execService serviceid、メソッド名、var args paramsなどの呼び出し)、REALサービスで呼び出されます。
低レベルの詳細の一部を省略しましたが、おそらくそれを整理することができます。RMIから離れることができる場合は、Rienaを調べることをお勧めします(Riena用のRMIトランスポートを作成する方法もあるかもしれませんが、私はわざわざ試してみませんでした)
あなたが何を達成しようとしているのかはあまり明確ではありません。サービスがあり、RMIを使用してアクセスでき、OSGiサービスとして利用可能である必要がありますか?
ローカルマシンサービスへのインターフェイスを作成できると思います。次に、そのサービスに接続し、OSGiサービスレジストリでそのインターフェイスを公開するバンドルを作成できます。次に、メインバンドルは、インターフェイス名またはサービス名を使用してそのサービスを見つけることができます。
ローカルサービスへのRMI接続を取得するのにそれほど手間はかかりません。たぶん、初期接続を確立するためのいくつかの構成オプション。何らかの形のデカップリングを実現し、おそらくそれがRMIサービスであるという事実を隠すために、OSGiで公開する前に、サービスのファサードを作成することが重要な場合があります。
しかし、多分私はあなたを完全に誤解しました、そしてこれはすべて役に立たないです。
上記のCXFに加えて、通信フレームワークのコレクションであり、OSGi 4.2リモートサービス(別名分散OSGi)の初期実装を提供するEclipseECFもあります。これは、クライアントがバインドするローカルサービスをVMに登録し、リモートマシン上にプロキシを作成することで機能し、選択したテクノロジ(RMI、WebServicesなど)を使用して呼び出しをリモート化できます。
明らかに、これは値によるメソッド呼び出し構文(サービスが知る必要がある)を使用しますが、それ以外の通信エラーはRuntimeExceptionです。
確かにそうです。https://docs.paremus.com//display/NIM20/Homeをチェックしてください。これには、高性能RMI配布プロバイダーを含むOSGiRSA実装が含まれています。
OSGi仕様バージョン4.2の「リモートサービス」の章を確認してください。これは、複数のOSGiコンテナー間でサービスを分散するための標準的な方法を定義します。
OSGi仕様の最新バージョン4.3は、これをさらに詳細にサポートしています。第6章「リモートサービス」および「112リモートサービス管理サービス」を参照してください。