2016-08-10 10 views
1

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))); 
    } 
} 

答えて

0

あなたをtを再考する必要がある彼のアプローチはVert.xではうまくいきません。あなたがやろう何

は、あなたの@Timerメソッドが呼び出されたときにカウントを開始し、任意のAsyncResultが返されたときにカウントを停止しています。

できること:vertx.eventBus().publish()を使用して開始/停止の指標を送信します。別のVerticleを使用してvertx.eventBus().consumer()のメトリックを収集し、表示します。

また、Vert.x Dropwizard Metricsをご覧ください。あなたが望むものが実際の統計量であれば、彼らはあなたの側から多くの実装をせずに、あなたのためにそれを提供します。

+0

javassistを使用して各メソッド内の適切な領域にソースコードを注入する方法はありますか?私はうまくいくようなデモを書いていますが、十分に深く掘り下げたわけではありません。 – zzztop

+0

あなたは自分のためにやっている、そして一度だけ、あなたはそれを試すことができます。しかし、プロダクション用にこのような変更を行うと、予測できない結果が発生します。 –

+0

は、作成されたラムダメソッドの動的な側面のためにASMが唯一の解決策であるようです – zzztop

関連する問題