0

私はこれ(OSGI)で本当に初めてで、簡単な例をやろうとしています。私は怠惰な行動を働かせることができません。このような問題を解決するブループリント実装がいくつかあることは知っていますが、その実装に進む前に、いくつかの基本を学んでおくとよいと思いました。

    バンドル データサービス:
    マニフェスト バージョン: 1.0  
    バンドル バージョン: 1.0.0  
    バンドル名: DataService  
    バンドル マニフェスト バージョン: 2  
    バンドル アクティベーター: DataService.Activator  
    インポート パッケージ: org.osgi.framework  
    Bundle-SymbolicName: DataService  
    エクスポート パッケージ: DataService;version="1.0.0"  
    Bundle-ActivationPolicy: レイジー  

    バンドル DataServiceClient:  
    マニフェスト バージョン: 1.0  
    バンドル バージョン: 1.0.0  
    バンドル名: DataServiceClient  
    バンドル マニフェスト バージョン: 2  
    バンドル アクティベーター: DataServiceClient.Activator  
    Import-Package: org.osgi.framework, DataService;version="[1.0.0,1.0.0]"  
    Bundle-SymbolicName: DataServiceClient

OK、コードを変更しましたが、まだうまくいきません。

外部アプリケーション、バンドルのインストール、フレームワークの開始、および DataServiceClient バンドルのみの開始。どのバンドル クラスにもアクセスできません。

    File bundleDir = new File("./bundles/");  
    String[] bundleResources = bundleDir.list();  
    for(String bundleResourcePath : bundleResources) {  
        File bundleResource = new File(bundleDir, bundleResourcePath);  
        InputStream bs = new FileInputStream(bundleResource);  
        mFramework.getBundleContext().installBundle(bundleResource.getName(), bs);  
    }  
    mFramework.start();  

    bl = mFramework.getBundleContext().getBundles();  
    for(バンドル b : bl) {  
        if (b.getBundleId() != 0 && b.getSymbolicName().contains("DataServiceClient")) {  
            b.start();  
        }           
    }   


これが DataServiceClient の開始です。

    System.out.println("DataServiceClient 開始");
    IDataService サービス = new DummyService();
    System.out.println(service.getData());



「DataService」バンドルの DummyService クラスは次のとおりです。

    public class DummyService は IDataService を実装します {

        @オーバーライド
        public String getData() {
            「DummyService データ」を返します。
        }
    }

「DataService」バンドルの開始は次のとおりです。

    System.out.println("DataService 開始");

私が得ている出力:

    DataServiceClient 開始
    ダミーサービス データ

ただし、次のことを期待しています。

    DataServiceClient 開始
    DataService 開始
    ダミーサービス データ

http://www.osgi.org/Design/LazyStartから少し引用

レイジーアクティベーション

レイジー アクティベーションは、バンドルからクラスをロードする要求が最初に成功したときに、バンドルをアクティベートする必要があるライフ サイクル ポリシーです。

ただし、機能しないため、遅延アクティベーションの概念を完全に誤解しているか、何か間違っていると思います。

DataService バンドルの開始を明示的に呼び出さない限り、DataService バンドルの Activator.start を呼び出さないようです。これは私がatmを取得していないものです。

お時間ありがとうございました

4

3 に答える 3

1

DummyClient.GetData() を呼び出したときに何が起こっているのかは明確ではありません。DataService バンドル内のクラスを呼び出すとのことですが、どのように?? DataService は通常のバンドルであり、コードはメインの Java ランチャー アプリケーションです。OSGi では、「外部」アプリケーションが通常のバンドルに静的に依存する方法はありません。

とにかく、これができたとしても、バンドルが開始される前にこのコード行を実行します。バンドルアクティベーターは、バンドルが開始される前に呼び出されることはありません!! アクティベーターは 36 行目、つまりbundle.start()各バンドルを呼び出す場所で呼び出されると思います。

しかし、本当に... 一体何をしようとしているのですか?? 旗はBundle-ActivationPolicy: lazyほとんど役に立たない。私は OSGi の経験が 8 年ありますが、レガシーな理由から、Eclipse RCP アプリケーションでしかこの設定を使用したことがありません。Eclipse プラグインまたは Eclipse RCP アプリケーションを作成している場合を除き、OSGiでは使用しないBundle-ActivationPolicy: lazyでください。

OSGi で遅延 (または「ジャスト イン タイム」) インスタンス化を取得する適切な方法は、Declarative Services (DS) を使用することです。DS によって公開されたすべてのサービス オブジェクトは、クライアントが登録時ではなく、最初に呼び出しを試みたときに、オンデマンドでインスタンス化されます。これを有効にするために特別なことをする必要はありません。

于 2013-12-25T03:54:32.293 に答える
0

変更されたコードに関して...実際にバンドルDataServiceClientを開始することはないため、そのアクティベーターを呼び出すことはできません。バンドルを開始するループから名前で明示的に除外しました。OSGi は、BundleActivatorで開始されたバンドルのみを呼び出しますbundle.start()

これは非常に誤解されている点です...フラグが有効になっていても、 OSGiは bundles を自動的に開始しません。Bundle-ActivationPolicy: lazy

おそらく、次のようにバンドルを開始するつもりでした。

bundle.start(Bundle.START_ACTIVATION_POLICY).

実際、バンドルのサブセットを任意に開始するのではなく、すべてのバンドルに対してこれを行います。

しかし、繰り返しになりますが、他の回答で述べた点を繰り返します。Bundle-ActivationPolicy: lazyEclipse RCP アプリケーションを開発している場合を除いて、使用しても意味がありません。

于 2013-12-25T16:33:29.573 に答える