2013-06-28 42 views
4

這是問題 -異步執行方面使用AspectJ

我使用@Async提供的異步執行一些方法。但是,因爲它是基於代理的,所以如果方法是從同一個類中調用的,它將不起作用。 我確實需要從同一個類中調用異步方法。

我知道如果我使用AspectJ而不是Spring AOP,我將能夠做到這一點。

所以我的問題是,有沒有辦法使用Spring的@Async和加載時間編織它? 或者,有沒有一個基於AspectJ的異步執行方面已經寫入,我可以使用,而不是寫我自己的?

回答

2

你可以做的一件事是將一個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; 
    } 
} 
5

是,標註具體的類的方法與@Async,把spring-aspects JAR(包含異步方面)到您的類路徑,用在你的Spring配置<task:annotation-driven mode="aspectj" />和應用無論是在編譯時或加載時編織,將spring-aspects作爲方面庫參考。

+0

http://www.springbyexample.org/examples/aspectj-ltw.html – Vadzim

+0

我使用編譯時織,我不認爲我會永遠回去:) –

+0

原來我該模式=」 aspectj「是使它工作的關鍵。我使用編譯時在私有方法上編織@Async。不幸的是,它沒有被Spring文檔覆蓋。 –