收集Async方法返回的所有Feature对象

时间:2013-12-08 22:04:40

标签: spring asynchronous aop aspectj future

我正在使用Spring Framework堆栈,我正在尝试实现以下功能。

我想在@Async方法返回的每个'Feature'对象中存储一些地图。

到目前为止,我设法编写了一个Aspect,注册了这样的方法,但是,它没有得到异步“特征”代理,但它已经得到了这个方法的结果 - 当方法完成时返回值。所以@AfterReturning方面注册不是为了返回代理,而是在方法完成后注册实际值。到目前为止,我已经发现,如果我有另一个对象,它只执行我的@Async方法,并转发生成的功能,然后注册该Future,获取我想要的Future(代理)。但是,使用另一个代理调用每个异步方法的对象是一个麻烦的解决方案。

@Component
public class Sample {
    @Async
    @MyAnnotation
    public Future<Integer> run() {
        // long running operation
        return new AsyncResult(10);
    }
}

@Component
@Aspect
public class SampleAspect {

 @AfterReturning(pointcut = "@annotation(myAnnotation )", returning = "retVal")
    public Object process(Object retVal, String reqId, MyAnnotation myAnnotation ) throws Throwable {
        // method execution has already finished here
        // retval is instanceof AsyncResult, I want it to be a Future proxy
        return retVal;
    }
}

需要额外对象的解决方法

@Component
public class OtherSample {
    @Autowired Sample sample;

    @OtherAnnotation
    public Futgure<Integer> run() {
        return sample.run();
    }
}


@Component
@Aspect
public class OtherAspect {

 @AfterReturning(pointcut = "@annotation(otherAnnotation)", returning = "retVal")
    public Object process(Object retVal, String reqId, OtherAnnotation otherAnnotation ) throws Throwable {
        // method execution has NOT finished here
        // retval is instanceof Future proxy
        return retVal;
    }
}

1 个答案:

答案 0 :(得分:1)

这不是你问题的直接答案,但它是一种解决方法的提议。

为@Async注释方法创建方面是一个非常具体的情况。难道你不能只创建 org.springframework.core.task.AsyncTaskExecutor 的专用实现吗?

这是我之前项目中的simple configuration。我用它来处理(记录)从任务中抛出的异常。