我正在使用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;
}
}
答案 0 :(得分:1)
这不是你问题的直接答案,但它是一种解决方法的提议。
为@Async注释方法创建方面是一个非常具体的情况。难道你不能只创建 org.springframework.core.task.AsyncTaskExecutor 的专用实现吗?
这是我之前项目中的simple configuration。我用它来处理(记录)从任务中抛出的异常。