0

我有 Spring boot 应用程序AspectJ配置为在一项服务返回数据后异步工作,但这有时无法触发,只有没有错误日志没有警告,这可以随时发生,如果我错过了任何 conf,请告诉我?

应用代码

@SpringBootApplication
@EnableAspectJAutoProxy
@EnableAsync
public class TitlesCompareUtilityApplication {

    public static void main(String[] args) {
        SpringApplication.run(TitlesCompareUtilityApplication.class, args);
    }

}

方面代码

@Aspect
@Component
public class DistributedLoggingAspect {

    private static Logger log = LoggerFactory.getLogger(DistributedLoggingAspect.class);

    @Async
    @AfterReturning("execution(* com.mycomp.repo.TyRepository.findById(..))")
    public void logAfterReturn(JoinPoint joinPoint) {
        int id = (int) joinPoint.getArgs()[0];
        log.info("logAfterReturn() is running! id:{}", id);
    }
}
4

1 回答 1

2

由于技术原因,我发现它极不可能,甚至几乎不可能,有时会错过建议执行,因为当调用公共 Spring bean/组件方法并且存在 AOP 代理时,该代理将拦截方法调用,除非您执行 self -invocation(类内部方法调用)。建议是在同一个线程还是异步线程中执行(如果可能的话),应该无关紧要。

相反,由于您的应用程序的异步特性,日志条目没有按照您期望的顺序出现,或者在高负载情况下您的记录器缓冲区溢出(取决于您的配置)并且日志消息丢失的可能性更大在它们被写入之前。

于 2020-05-19T09:00:26.303 回答