這是問題 -異步執行方面使用AspectJ
我使用@Async提供的異步執行一些方法。但是,因爲它是基於代理的,所以如果方法是從同一個類中調用的,它將不起作用。 我確實需要從同一個類中調用異步方法。
我知道如果我使用AspectJ而不是Spring AOP,我將能夠做到這一點。
所以我的問題是,有沒有辦法使用Spring的@Async和加載時間編織它? 或者,有沒有一個基於AspectJ的異步執行方面已經寫入,我可以使用,而不是寫我自己的?
這是問題 -異步執行方面使用AspectJ
我使用@Async提供的異步執行一些方法。但是,因爲它是基於代理的,所以如果方法是從同一個類中調用的,它將不起作用。 我確實需要從同一個類中調用異步方法。
我知道如果我使用AspectJ而不是Spring AOP,我將能夠做到這一點。
所以我的問題是,有沒有辦法使用Spring的@Async和加載時間編織它? 或者,有沒有一個基於AspectJ的異步執行方面已經寫入,我可以使用,而不是寫我自己的?
你可以做的一件事是將一個bean一起折起來,這個bean的唯一目的是異步運行並將工作傳遞給該方法。如果你喜歡在你的界面或其他地方放置@Async,這可能不會使API變得非常漂亮,但它完成了工作。
public interface AsyncExecutor {
void runAsynchronously(Runnable r);
}
public class SpringAOPAsyncExecutor implements AsyncExecutor {
@Async
@Override
public void runAsynchronously(Runnable r) {
r.run();
}
}
public MyService implements SomeInterface {
@Autowired
private AsyncExecutor springAOPAsyncExecutor;
public ObjectHolder calculateAsychronously() {
final ObjectHolder resultHolder = new ObjectHolder();
springAOPAsyncExecutor.runAsynchronously (new Runnable() {
public void run() {
//do some calculatin
resultHolder.setValue(whatevs);
}
});
return resultHolder;
}
}
是,標註具體的類的方法與@Async
,把spring-aspects
JAR(包含異步方面)到您的類路徑,用在你的Spring配置<task:annotation-driven mode="aspectj" />
和應用無論是在編譯時或加載時編織,將spring-aspects
作爲方面庫參考。
http://www.springbyexample.org/examples/aspectj-ltw.html – Vadzim
我使用編譯時織,我不認爲我會永遠回去:) –
原來我該模式=」 aspectj「是使它工作的關鍵。我使用編譯時在私有方法上編織@Async。不幸的是,它沒有被Spring文檔覆蓋。 –