我是AspectJ的新手,我試圖弄清楚,如何保持/跟蹤多個異步方法調用的上下文。想象一下下面的代碼:AspectJ保持異步方法調用的上下文
@TimerStart
public void doSomething() throws InterruptedException {
Thread.sleep(1000);
MyCallable callable = new MyCallable();
Future future = executorService.submit(callable);
}
private class MyCallable implements Callable {
@Override
public Object call() throws Exception {
someOtherMethod();
return null;
}
@TimerEnd
private void someOtherMethod() throws InterruptedException {
Thread.sleep(1000);
}
}
我想衡量@TimerStart和@TimerEnd之間傳遞的時間。我現在正在努力解決兩個問題:
- 如何保持物體之間的對象。某個方面的字段似乎都是靜態的,那麼併發問題又如何......?
- 如何獲得兩個建議,一個在@TimerStart之前執行,另一個在@TimerEnd之後執行。
目前我有沿此線的東西:
public aspect TimerAspect {
pointcut timerStart(Object object, TimerStart timed):
execution(@TimerStart * *(..)) && this(object) && @annotation(timed);
pointcut timerStop(Object object, TimerEnd timed):
cflow(execution(@TimerEnd * *(..)) && this(object) && @annotation(timed) && !within(FlowTimerAspect));
before(Object object, TimerStart timed): timerStart(object, timed) {
System.out.println("##### Flow timer START");
}
after(Object object, TimerEnd timed): timerStop(object, timed) {
System.out.println("##### Flow timer STOP");
}
但是我得到現在的唯一的事情就是一個StackOverflowException(是的,我知道 - 這就是爲什麼我問這裏)。
編輯: 我偶然發現了percflow
這似乎這樣的伎倆,但只有當@TimerStart和@TimerEnd出現在同一個線程。建議非常感謝!
public aspect TimerAspect percflow(timerStart(Object, TimerStart)) {
private long context;
pointcut timerStart(Object object, TimerStart timed):
execution(@TimerStart * *(..)) && this(object) && @annotation(timed);
pointcut timerStop(Object object, TimerEnd timed):
execution(@TimerEnd * *(..)) && this(object) && @annotation(timed);
before(Object object, TimerStart timed): timerStart(object, timed) {
context = System.currentTimeMillis();
}
after(Object object, TimerEnd timed): timerStop(object, timed) {
long passed = System.currentTimeMillis() - context;
System.out.println("passed time: " + passed);
}
}
根據我所描述的,您的代碼正常工作,謝謝。但是,它有點脆弱 - 例如。當在使用@TimerStart註解的方法運行之前構造Callable時,它當然無法將兩個線程鏈接在一起。 – schneida
的確很脆弱,因此需要通過不同的理智檢查來加強,仔細考慮在意外使用模式下會發生什麼情況。您可能希望優雅地處理這些情況,而不會干擾應該運行的原始代碼,因爲這只是應用程序的測量方面。處理所有這些微妙之處已經超出了我的答案範圍,我只想告訴你一種方法來克服你一直面臨的最初問題。 –
好的,謝謝你的回答:-) – schneida