我有一个@Afterreturning 方面。
@AfterReturning(value = "@annotation(****)",returning = "returnValue")
public void auditableUponReturn(final JoinPoint joinPoint, Object returnValue) {
//takes 500 ms
}
我有一个调用此方面的端点
@GetMapping("/{id}")
@AspectInvoker
public Name getName(){
//takes 100 ms
}
当我调用此端点时,我预计此端点需要 100 毫秒并在我的方面相关代码正在处理时立即返回。但在方面相关代码完成之前,端点不会返回。
这是预期的吗?有什么方法可以解决这个问题,以便 api 的性能不受方面相关代码的影响?
是的,您所经历的行为是预期的。原因是您注册的方面与您的端点在同一线程中运行。
您可以利用
@Async
(与 @EnableAsync
一起)在单独的线程中执行方面逻辑。 但是这种方法会在每次调用方法时创建一个新线程。与方面的同步执行相比,这是否会给您带来显着的性能优势是值得怀疑的。
您可能会发现此线程有助于更全面地理解:如果我将 @Async 方法放在切面上,它会异步执行吗?