OSGi バンドル ( cluster_implementation
) を Declarative Service (DS) コンポーネント定義で定義し、エクスポートされたサービスを 1 つ、アクティブ化メソッドを 1 つ、非アクティブ化メソッドを 1 つ指定しました。
Activate メソッドの本体で、ファイル システムには存在しないが OSGi バンドル自体にバンドルされている 1 つのファイルにアクセスする必要があります。activate メソッドの間、ファイルの内容はInputStream
usingとして取得されますjava.lang.ClassLoader:getResourceAsStream
。
これはほとんどの場合機能しますが、機能しないケースが 1 つあります。私のアプリケーションでは、によってエクスポートされたサービスcluster_implementation
は、サービス レジストリ、宣言型サービス、または spring-dm を介して他のバンドルから参照できます。コンポーネントのアクティブ化ポリシーはdelayed
、サービスへの最初の参照が発生したときにアクティブ化されるようになっています。
Declarative Service コンポーネントからの参照が原因でアクティベーションが発生した場合、ファイルの内容は正常に読み取られます。代わりに、spring-dm コンポーネントがサービスを必要としているためにアクティベーションが発生した場合InputStream
、リソースの はNULL
! 今のところ、コンポーネントのプロパティを設定してコンポーネントをすぐにアクティブにすることで問題を解決しましたimmediate="true"
が、私の要求は次のとおりです。
- DS コンポーネントのアクティブ化中にリソースのコンテンツをストリームとして取得することはできますか?
- これが合法である場合、spring-dm を介してアクティブ化すると、ストリームとしてのリソースにアクセスできなくなるのはなぜですか? ところで、リソースはそこにあります-私がやれば、
Bundle.findEntries
それを見ることができます!
私が使用している OSGi フレームワークは Equinox 3.6 です。