NIOのメソッド実行をアスペクトに実装しようとしています。非ブロックIOコールのaspectjタイマー
基本的には、メソッドが最初に呼び出されたとき、コールバックがトリガされたとき(コールバックは常にfailed()またはsucceeded()コールのいずれかです)、最初のメソッド呼び出しを関連付ける必要があります適切なコールバックで。
私は、次の実装を持っているが、それは通話はもちろんケースではありませんどのシリアルに作られていない限り動作しません。
すべてのヘルプは素晴らしいことだ
public aspect TimerAJ {
private long timer = 0;
private String methodName;
private static Logger logger = LoggerFactory.getLogger(TimerAJ.class);
//the call to the call back method
pointcut timerCall1() : target(io.vertx.core.AsyncResult) && (call(* io.vertx.core.AsyncResult.failed(..)) || call(* io.vertx.core.AsyncResult.succeeded(..)));
//the call to the method itself
pointcut timerCall2() : execution(@Timer * *(..));
before() : timerCall2() {
timer = System.currentTimeMillis();
methodName = methodSignature.getName();
}
after() : timerCall1() {
logger.info(methodName + " " + String.format("%s took %d ms", thisEnclosingJoinPointStaticPart.getSourceLocation().getWithinType().getName(), (System.currentTimeMillis() - timer)));
}
}
javassistを使用して各メソッド内の適切な領域にソースコードを注入する方法はありますか?私はうまくいくようなデモを書いていますが、十分に深く掘り下げたわけではありません。 – zzztop
あなたは自分のためにやっている、そして一度だけ、あなたはそれを試すことができます。しかし、プロダクション用にこのような変更を行うと、予測できない結果が発生します。 –
は、作成されたラムダメソッドの動的な側面のためにASMが唯一の解決策であるようです – zzztop