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についてもっと学びたいと思っています。
ご回答ありがとうございます。 Spring AOPは明らかにコールを許可しません。私は、ポイントカットの "内側"の部分に問題があります。電話の代わりに何が使えますか? –
遅れていますが、Spring AOPを使用している場合は、実行ポイントカットに固執する必要があると思います。 Spring AOPは、AspectJよりもはるかに少ないポイントカットをサポートしています。それでもHttpUtilクラスにポイントカットを入れたくない場合は、HttpUtil postEntity()コールだけを行う「プロキシ」メソッドを定義し、プロキシメソッドの周りに実行ポイントカットを配置することができます。 – Luke