2016-10-25 3 views
0

まだOSGIを学習しようとしています。しかし、誰かが私にこのことが可能か、このサンプルコードで間違っているかもしれないか教えてもらえますか?リモートOSGIサービスコール

サービスミックスで動作する2つのバンドルがあります。

public class Activator implements BundleActivator { 

    public void start(BundleContext context) throws Exception { 
     context.registerService(Checker.class.getName(), new CheckerImpl(), null); 
    } 
} 

public interface Checker{ 
    public void checkMe() 
} 

public class CheckerImpl implements Checker{ 
    public void checkme(){ 
     System.out.println("Hello World"); 
    } 
} 

上記の束は、一つの機能runCheckを(持ってチェッカーと呼ばれるインタフェース) と、このインタフェースを実装するクラスが含まれています(ここで、この場合にはrunCheckは()だけのHello Worldを出力します。)

です「リモート」バンドル我々は(第一バンドル内のインターフェイスと同じコードが含まれています)チェッカーと呼ばれる別のインターフェイスを持って、このバンドルに

public class RemoteActivator implements BundleActivator { 

public void start(BundleContext context) throws Exception{ 
    serviceRef = context.getServiceReference(SVC_REF_CERTCHECK); 

    if (serviceRef == null) { 
     logMsg("Servicereference is null"); 
     throw new NullPointerException(); 
     } 
    else{ 
     logMsg("Check: " + context.getService(serviceRef).getClass().toString()); 


     Object svc = context.getService(serviceRef); 

     logMsg(svc.toString()); 

     Checker check = (Checker) svc; 

     svc.runCheck(); 
} 

public void logMsg(Object o){ 
    System.out.println(o); 
} 
} 

public interface Checker{ 
    public void checkMe() 
} 

しかし、私はそれが

Checker check = (Checker) svc; 
svc.runCheck(); 

に取得し、作業を停止し実行するたびに(doesnのエラーメッセージを出すことさえありません)。 私は

svc.toString() 

を実行することができ、それがCheckerImpl内の過負荷メソッドからコードを実行すると、受信したオブジェクトが他のサービスであることを知っています。

リモート呼び出しサービス内で.jarバンドルに依存する必要がありますか?

ありがとうございます!

答えて

0

私はリモート/クライアントバンドルに新しいインターフェイスを追加するのではなく、メインバンドルの依存関係をpom.xmlに追加する必要があります。

メインサービスクラスpom.xmlが必要なパッケージ/クラスをエクスポートすることを確認する必要があります。

<Export-Package> 
    my.pachage.bundle.*; 
</Export-Package> 
2

2つのCheckerインターフェイスが各バンドルに1つあります。それらは各バンドルのクラスローダによってロードされるため、VMが関係する限り異なるクラスです。 サービスを使用するサービスバンドルとクライアントバンドルは、同じサービスインターフェイスクラスを共有する必要があります。このため、1つのバンドルがサービスインターフェイスクラスを含むパッケージをAPIとしてエクスポートし、他のバンドルがそのパッケージをインポートする必要があるのはこのためです。サービスは型共有の上に構築されます。

関連する問題