这是问题 -异步执行方面使用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文档覆盖。 –