2011-09-20 7 views
3

サービスを公開(エクスポート)するOSGiバンドル(これは私が所有していないため変更できません)を使用しています。サービス(その前後にいくつかの前処理/後処理を実行するために)。これらはApache Felixコンテナにデプロイされています。OSGiバンドル全体のサービスにアスペクトを追加する

私は独自のOSGiバンドル(明らかにEchoServiceをインポートします)を作成し、標準のSpring AOPを使用してSpringの特徴をアタッチしました。しかし、アスペクトがアタッチされておらず、インターセプタが呼び出されていないように見えます。

私は自分のバンドルに属していないサービスを傍受しようとしているからです(これは妥当と思われます)。あれは正しいですか?どうすればこれを克服できますか?ここで

は私の迎撃/側面は次のようになります。

@Before("serviceOperation()") 
    public void before(JoinPoint jp) { 
     logger.debug("Entering method: " + jp.toShortString()); 
    } 

    @AfterReturning("serviceOperation()") 
    public void after(JoinPoint jp) {  
     logger.debug("Exiting method: " + jp.toShortString());  
    } 
+0

あなたのランタイム環境と作成しようとしている側面の詳細について私たちにお伝えください。 –

+0

"実行環境に関する詳細" - 正確な詳細を探してください。また、「種類の側面」については、上記のインターセプタスニペットを追加しました。 – Saket

+0

springとOSGiをどのように組み合わせますか?どのosgiフレームワークですか?それはスタンドアロンのアプリですか、それともコンテナ内で動作しますか?どのコンテナ?あなたは純粋なSpringのアスペクトを使用していますか、ApsectJのロードタイム織りと組み合わせて使用​​していますか? –

答えて

1

私はAOPにも春の専門家ではないんだけど、多分私はあなたにいくつかのアイデアを与えることができます。限り、私はSpring use standard J2SE dynamic proxies for AOP proxiesを参照してください。したがって、元のEchoServiceオブジェクトの代わりにクライアントshould use the proxy"the proxies are created by sub-classing the actual class"のため、CGLIBプロキシを使用している場合も同様です。

クライアントがEchoServiceを要求する場合は、何らかの理由でプロキシを渡す必要があります。これをOSGiコンテナの内部に入れるには、EchoService(プロキシ)をエクスポートして、クライアントがオリジナルではなくプロキシされたサービス/バンドルを使用していることを確認する必要があります。これを行うには、(プロキシされた)パッケージに異なるバージョン番号を設定し、このバージョンをクライアントバンドルのインポート要件として設定します。 (私はEchoServiceのクライアントを変更することができます)サービスの場合は、サービスを登録するときにプロパティを設定し、このプロパティを持つサービスのみを照会するようにクライアントを変更します。

クライアントバンドルを変更できない場合は、元のバンドルをバンドル内の内部jarとしてラップすることもできます。ラップされたバンドルのアクティベータをアクティベータから呼び出して、変更したBundleContextを渡すことができます。このBundleContextは、元のEchoServiceではなく、登録サービスコールをキャッチしてプロキシオブジェクトを登録する必要があります。 BundleContextServiceListenerなどは通常インターフェイスですので、シンプルなデリゲートパターンを使用できます。私はそれが動作すると思うが、それはおそらく他の課題があります。

関連する問題