1

OSGi バンドル ( cluster_implementation) を Declarative Service (DS) コンポーネント定義で定義し、エクスポートされたサービスを 1 つ、アクティブ化メソッドを 1 つ、非アクティブ化メソッドを 1 つ指定しました。

Activate メソッドの本体で、ファイル システムには存在しないが OSGi バンドル自体にバンドルされている 1 つのファイルにアクセスする必要があります。activate メソッドの間、ファイルの内容はInputStreamusingとして取得されます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 です。

4

2 に答える 2

0

あなたが思っている以上に、別の問題を抱えているに違いないと思います。リソースへのアクセスは、解決されたバンドルで利用でき、DS とはまったく関係ありません。クラスがロードされるため、コードを JAR からロードできます。

動作が不可解で、フレームワークのエラーである可能性があります。フラグメントを使用すると、これがうまくいかないことしか想像できませんでしたか? しかし、それでも意味がないようです。別のフレームワークを試しましたか? Felix は非常に優れた診断機能を備えています。

于 2012-09-28T07:24:23.087 に答える
0

アクティベーターとスプリング dm の間にタイミングの問題があると思います。Spring dm は、エクステンダーを使用して、Spring コンテキストを持つバンドルを監視し、それらを初期化します。これは、アクティベーターと並行して実行される場合があります。正直なところ、アクティベーターが最初に実行されると予想していましたが、そうではないようです。

これを解決するには、最初にファイルにアクセスする側でファイルが作成されていることを確認できますが、スレッドセーフにするように注意してください。

于 2012-09-28T06:39:07.937 に答える