0

私は OSGI テクノロジを実際に使用したばかりで、基本的なクエリはほとんどありません。これが私がやったことです:

「com.mypackage.osgi.bundle.service」というパッケージに HelloWorld インターフェイスを作成しました。このインターフェイスはメソッドを次のように公開します。 public String sayHello(String arg);

「com.mypackage.osgi.bundle.service.impl」というパッケージに HelloWorldImpl クラスを作成しました。このクラスは HelloWorld インターフェイスを実装し、sayHello() メソッドの実装を提供します。

「com.mypackage.osgi.bundle.activator」というパッケージに HelloWorldActivator クラスを作成しました。このクラスは、BundleActivator インターフェイスを実装し、インターフェイスの start() および stop() メソッドを実装します。

start() メソッドでは、「BundleContext」を介してこのバンドルをサービスとして登録しています。コードは次のとおりです。

public class HelloWorldActivator は BundleActivator を実装します {

ServiceRegistration helloServiceRegistration;

public void start(BundleContext context) throws Exception {

    HelloWorld helloService = new HelloWorldImpl();
    helloServiceRegistration =context.registerService(HelloWorld.class.getName(), helloService, null);    System.out.println("Service registered");    }

public void stop(BundleContext context) throws Exception {

    helloServiceRegistration.unregister();    System.out.println("Service un-registered");
} }

次に、このプロジェクトを maven プラグインを使用して OSGI バンドルとしてパッケージ化し、OSGI コンテナー (Equinox) にデプロイします。手順では、インターフェイスを export-package として公開しました。OSGI バンドルが OSGI コンテナーにサービスとして正常にデプロイされていることがわかります (バンドル ID は ACTIVE 状態を示し、osgi コンソールで「サービスが登録されました」という出力も確認できます)。

次のステップは、上記の OSGI バンドルをサービスとして使用することです。これを行うために、「ServiceReference」を使用できることを理解しています。

上記で作成したサービスのコンシューマーとして機能するように、まったく新しい Java プロジェクトを作成しているとします(したがって、このプロジェクトのワークスペースには上記で作成したものとのリンクはありません)。

私の質問は - この新しい Java プロジェクトで HelloWorld インターフェイスの「コピー」を作成する必要がありますか? つまり、この新しいプロジェクトのワークスペースで、このインターフェイスを「スタブ」として持つ必要がありますか?

これを尋ねる理由は、新しいプロジェクトのワークスペースに「HelloWorld」インターフェイスのコピーがない場合、下記の 2 行目と 3 行目でコンパイル エラーが発生するためです。

public class ConsumerActivator は BundleActivator を実装します {

ServiceReference helloServiceReference;

public void start(BundleContext context) throws Exception {

    helloServiceReference= context.getServiceReference(HelloWorld.class.getName()); //2
    HelloWorld helloService =(HelloWorld)context.getService(helloServiceReference); //3
    System.out.println(helloService.sayHello("Test user"));

}
public void stop(BundleContext context) throws Exception {

    context.ungetService(helloServiceReference);
} }

では、コンシューマ バンドルには、使用する予定のサービス インターフェイスの「スタブ」が必要であると言うのは正しいでしょうか?

非常に基本的な質問に聞こえる場合は申し訳ありませんが、ネット上のどこにも言及が見つからなかったため、明確にする必要があります。提供されるすべての例では、コンシューマーとサービスの両方が同じコード ワークスペースの一部であることを前提としています。

明確にするために事前に感謝します。

よろしくLB

4

2 に答える 2

3

いいえ、2 つのプロジェクト間の依存関係を作成するだけです。

また、OSGi を使い始めたばかりの場合は、低レベルの OSGi API を使用しないでください。これは、シェル スクリプトの書き方を学ぶ前に、Linux カーネルをハックしようとするのと同じです。宣言型サービスから始めてください... ここのチュートリアルを参照してください: http://bndtools.org/tutorial.html

于 2013-12-11T19:03:37.277 に答える
1

いいえ、API バンドルの一部としてインターフェイスを含む別のバンドルを用意することをお勧めします。そのため、実際のサービス プロバイダーとは別のインターフェイスを持つことができます。ただし、あなたの場合、このアプローチはやり過ぎであり、HelloWorld インターフェイスとその (サービス) 実装を同じバンドルに配置します。

于 2013-12-11T19:01:42.550 に答える