使用AspectJ的异步执行方面

时间:2013-06-28 20:41:48

标签: java spring aop aspectj spring-aop

这是问题 -

我使用Spring提供的@Async来异步执行某些方法。但是,因为它是基于代理的,所以如果从同一个类中调用该方法,它将不起作用。 我确实需要在同一个类中调用我的异步方法。

我知道如果我使用AspectJ而不是Spring AOP,我将能够做到这一点。

所以我的问题是,有没有办法使用Spring的@Async和加载时间编织它? 或者,是否已经编写了一个基于AspectJ的异步执行方面,我可以使用,而不是编写自己的?

2 个答案:

答案 0 :(得分:5)

是的,使用@Async注释具体类'方法,将spring-aspects JAR(包含异步方面)放入类路径中,在Spring配置中使用<task:annotation-driven mode="aspectj" />并应用任一编译 - 时间或加载时编织,将spring-aspects引用为方面库。

答案 1 :(得分:2)

您可以做的一件事就是将一个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;
  }
}