为什么SpringBootAspectJ有时只会错过触发

为什么SpringBootAspectJ有时只会错过触发,spring,spring-boot,java-8,aspectj,spring-aspects,Spring,Spring Boot,Java 8,Aspectj,Spring Aspects,我已将Spring boot应用程序AspectJ配置为在一个服务返回数据后异步工作,但这仅在某些时候无法触发没有错误日志没有警告,这种情况随时都可能发生,如果我错过了任何配置,请通知我 应用程序代码 @SpringBootApplication @EnableAspectJAutoProxy @EnableAsync public class TitlesCompareUtilityApplication { public static void main(String[] args

我已将Spring boot应用程序AspectJ配置为在一个服务返回数据后异步工作,但这仅在某些时候无法触发没有错误日志没有警告,这种情况随时都可能发生,如果我错过了任何配置,请通知我

应用程序代码

@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);
    }
}

出于技术上的原因,我发现通知执行有时不太可能,甚至几乎不可能,因为当调用公共Springbean/组件方法并且存在AOP代理时,该代理将拦截方法调用,除非执行自调用(类内部方法调用)。建议是在同一线程中执行还是在异步线程中执行(如果可能的话),应该无关紧要


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

出于技术原因,我认为这是极不可能的,即使几乎不可能,该通知执行有时也会丢失,因为当调用公共Springbean/组件方法并且存在AOP代理时,该代理将拦截方法调用,除非您执行自调用(类内部方法调用)。建议是在同一线程中执行还是在异步线程中执行(如果可能的话),应该无关紧要


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

与我的本地验证中的情况相同。您是如何确认aspect有时无法触发的?你能不能提供一个我提到过的,很少发生的情况,我无法复制它,你是如何确认这个相位有时无法触发的<代码>@Around通知类型提供了更多的控制,可以帮助您调试。我没有看到aspect logAfterReturn的日志,但在服务中已成功执行,只要它不能在不同的机器上随意复制,并且没有证据显示通知中缺少的方面,就很难对可能发生的情况进行评论。若你们有一个可复制的测试用例,你们可以将它作为一个bug报告给spring团队。在我的本地验证中作为范例工作。您是如何确认aspect有时无法触发的?你能不能提供一个我提到过的,很少发生的情况,我无法复制它,你是如何确认这个相位有时无法触发的<代码>@Around通知类型提供了更多的控制,可以帮助您调试。我没有看到aspect logAfterReturn的日志,但在服务中已成功执行,只要它不能在不同的机器上随意复制,并且没有证据显示通知中缺少的方面,就很难对可能发生的情况进行评论。如果你有一个可复制的测试用例,你可以将它作为一个bug报告给spring团队。我已经搜索了整个日志文件,但没有找到日志,我认为你提到的第二个原因可能是,巨大的日志被生成,我会检查日志缓冲区设置,这是默认配置,现在这是一个完整的缺失问题:人们-包括我-不得不猜测。这意味着,他们可能错了。也许我是,也许不是。我已经搜索了整个日志文件,但没有找到日志,我想你提到的第二个原因可能是,生成了巨大的日志。我将检查日志缓冲区设置。它是默认配置。这是缺少完整日志的问题:包括我在内的人必须猜测。这意味着,他们可能错了。也许我是,也许不是。