【问题标题】:Asynchronous execution aspect using AspectJ使用 AspectJ 的异步执行方面
【发布时间】:2013-06-28 20:41:48
【问题描述】:

问题来了——

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

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

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

【问题讨论】:

    标签: java spring aop aspectj spring-aop


    【解决方案1】:

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

    【讨论】:

    • 我使用编译时编织,我想我永远不会回去 :)
    • 对我来说,mode="aspectj" 是让它发挥作用的关键。我在私有方法上使用编译时编织@Async。不幸的是,Spring 文档没有涵盖它。
    【解决方案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;
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2020-10-25
      • 1970-01-01
      • 2017-10-18
      • 1970-01-01
      • 1970-01-01
      • 2011-08-22
      • 1970-01-01
      • 2014-04-02
      • 1970-01-01
      相关资源
      最近更新 更多