0

やあみんな。EclipseRCPアプリケーションでOSGiサービスを使用しています。それらを追跡するために、org.osgi.util.tracker.ServiceTrackerクラスを使用しています。アプリケーションのサンプルコードは次のようになります

mailServiceTracker = new ServiceTracker(context, MailService.class.getName(), null);
mailServiceTracker.open();
MailService service = (MailService) mailServiceTracker.getService();

今私の問題は、新しいサービスを作成したときにgetService()メソッドが頻繁に戻ることです。nullこのコードは、アプリケーションに長期間存在するサービスに対しては非常にうまく機能しますが、新しいサービスを作成するたびに、サービスが最終的に検出されて追跡されるまで、多くのことを行う必要があります。私は定期的に例えば

  • Eclipseの「Clean...」
  • Eclipseのすべてのプロジェクトを「更新」する
  • コマンドラインでプロジェクトを再構築します

それらが役立つこともあれば、役に立たないこともあります。誰かがそれらのトラッカーの経験があり、この動作を回避する方法と、作成直後にサービスを追跡する方法を教えてもらえますか?

ありがとう

4

3 に答える 3

2

問題は、必要なサービスがまだ作成されていない可能性があることです(特に、一部のバンドルがまだ開始されていない可能性があるため、バンドルアクティベーターで)。それでもサービストラッカーを使用したい場合は、ServiceTrackerCustomizerを提供し、サービスが行き来するときにサービスを追跡する必要があります(申し訳ありませんが、しゃれは意図されていません)。

または、これを処理する宣言型サービスに切り替えることもできます。

于 2010-07-21T10:34:14.357 に答える
1

ServiceTrackersを使用しても、サービスを追跡するためのかなり低レベルの方法であるという事実以外に問題はありません。宣言型サービスは優れたメカニズムであることに同意しますが、「あらゆる種類の問題」のためにServiceTrackersを単に却下することは悪いアドバイスのように聞こえます。

質問に戻ります。

サービストラッカーが作成されて開かれるとすぐに、作成時に指定したフィルター条件に一致するすべてのサービスにアクセスできるようになります。そこに遅れはありません。私が考えることができる唯一のことは、どういうわけかあなたのバンドルが正しく解決されていないということです。そのため、バンドルAか​​ら登録されたサービスは、ServiceTrackerを使用してバンドルBに表示されません。これを確認するには、最初にサービスインターフェイスを含むパッケージをエクスポートするバンドルを見つけてから、AとBの両方が実際にバンドルに接続されていることを確認します。

OSGiの更新/更新メカニズムについてもう少し説明します。

OSGiで何かを更新するときはいつでも、それは2ステップのプロセスです。

エクスポートされたパッケージの新しいバージョンを含むバンドルを更新するとします。また、それを輸入する消費者がいると仮定しましょう。バンドルを更新するだけで、配線(どのインポートリンクからどのエクスポートへのリンク)を明示的に更新しない限り、コンシューマーは古いバージョンのパッケージに配線されます。パッケージの更新(PackageAdminサービスを介してOSGiで実行できること)を実行するとすぐに、コンシューマーは再度解決され、新しいバージョンに接続されます。

これが分離されている理由は、複数のバンドルの更新を実行し、各バンドルの後に「更新」するのではなく、すべてが更新されるまでそのような更新を延期したい場合があるためです。

これがあなたが見ている効果である可能性は十分にあります。最初は更新のみを行い、更新後にのみ、トラッカーは実際にサービスの新しいバージョンを確認します。

于 2010-07-02T13:57:21.287 に答える
0

まったく派手ではないので、サービストラッカーを使用しないでください。彼らはあなたの人生をシンプルにするように見えますが、それらにはあらゆる種類の問題があります。代わりに、宣言型サービスの使用を検討することをお勧めします。EclipseでのDSのサポートは、3.5以降非常に優れています。

サービストラッカーの使用が悪い考えである理由の詳細については、この本と関連するプレゼンテーションを確認することをお勧めします。

http://equinoxosgi.org/

于 2010-07-02T13:20:57.003 に答える