2017-02-22 19 views
0

Http要求を行う共通のHttpUtilクラスを共有する複数のクラスを持つSpringブートアプリケーションがあります。AspectJを使用してSpringブートアプリケーション内でREST呼び出しの実行時間を監視する

@Around("execution(* com.gateway.TestGateway.getStatus(..))") 
public Object GatewayStatus(ProceedingJoinPoint pjp) throws Throwable { 
    StopWatch watch = new StopWatch(); 
    watch.start(); 
    Object output = pjp.proceed(); 
    watch.stop(); 
    log.error("Call took - [" + (watch.getTime()) + "]ms"); 
    return output; 
} 

これがうまく働いていた、私は@Around注釈付きgetStatus()方法と一致すると思いますが、ゲートウェイの構成についてhttputilコールを囲むコードを持っている、とだけI:過去には、私は次のようにAspectJのを使用していました残りの呼び出しをプロファイルしたい

final HttpUtil httpUtil; //Constructor injected by Spring. 

public ResponseEntity<String> getResponse(final String serviceUrl, final HttpEntity<String> httpEntity) throws Exception { 

    ResponseEntity<String> response = null; 
    //Code here to verify the Entity 
    try{ 
     response = httpUtil.postEntity(serviceUrl, httpEntity, String.class, 
      httpUtil.getRestTemplate()); 
     //Logic here to work on the response. 
    } 
    catch(Exception e){ 
     log.error("Error occurred"); 
    } 
    return response; 
} 

私はこれをファクタし直す、またはHttpUtilクラスメソッド自体にプロファイラを使用することができます実現が、どのように私は、既存のメソッド内のコードのスニペットを一致させるためにAspectJのを使用することができます。新しいゲートウェイ方法は次のようになります?のように、postEntity()コールが開始し、postEntity()コールが終了した後に、が返されますが、方法が戻る前にが終了したときに実行します。

私は、Pointcutsや他のAspectJプロパティにあまり慣れていません。私がしようとしているのは、実行時間を記録することだけですが、私はAspectJについてもっと学びたいと思っています。

答えて

1

あなたがアドバイスを適用し、いくつかの余分なコードを実行したいプログラムのポイントを選ぶときは、postEntity()メソッド呼び出しのタイミングのように、あなたが選択したため点を結ぶポイントカット(S)を作成する必要がありますポジション。ポイントカットは、アドバイスが適用される場所(タイミングコードが開始される場所)を定義します。

あなたの質問は、ClassThatHasGetResponseクラスのpostEntity()の呼び出しでポイントカットを定義する方法に関するものだと思います。ポイントカットを記述するための

さまざまな方法hereを文書化し、いくつかの素晴らしいポイントカット例がhereされています。あなたの質問のために

、あなたがこのようなポイントカットかもしれません:

cflow(execution(Object ClassThatHasGetResponse.com.package.getResponse(..))) && call(* HttpUtil.postEntity(..)) 

を上記のポイントカットは実行の制御フローは、クラスClassThatHasGetResponseの方法getResponse()内で、メソッドの呼び出しが行われる場所を定義します任意の戻り値の型および任意のパラメータを使用してpostEntity()に変換します。

あなたは多分このように、タイミングデータをキャプチャアドバイスを@Aroundするには、このポイントカットを追加する必要があります:あなたが春を使用しているので

@Around("cflow(execution(Object ClassThatHasGetResponse.com.package.getResponse(..))) && call(* HttpUtil.postEntity(..))") 
public Object GatewayStatus(ProceedingJoinPoint pjp) throws Throwable { 
    StopWatch watch = new StopWatch(); 
    watch.start(); 
    Object output = pjp.proceed(); 
    watch.stop(); 
    log.error("Call took - [" + (watch.getTime()) + "]ms"); 
    return output; 
} 

、それはまた、注目に値することができることをSpringのサポートでAOPのために(これはAspectJと同じではありませんが、AspectJを使用している間にSpringを通してAOPについて最初に学ぶときに、他のIMOとの使用について混乱するのは簡単です)、ポイントカットAspectJの柔軟性からいくらか単純化されたメソッド実行のポイントです。 Source

+0

ご回答ありがとうございます。 Spring AOPは明らかにコールを許可しません。私は、ポイントカットの "内側"の部分に問題があります。電話の代わりに何が使えますか? –

+0

遅れていますが、Spring AOPを使用している場合は、実行ポイントカットに固執する必要があると思います。 Spring AOPは、AspectJよりもはるかに少ないポイントカットをサポートしています。それでもHttpUtilクラスにポイントカットを入れたくない場合は、HttpUtil postEntity()コールだけを行う「プロキシ」メソッドを定義し、プロキシメソッドの周りに実行ポイントカットを配置することができます。 – Luke

関連する問題