2013-06-28 41 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文档覆盖。 –