背景
在开发环境一切正常,一旦部署到生产就失效
困扰点
在开发环境完全无法复现。所以一开始都是尝试在修改,反复部署,都没有解决线上的问题。后面使用java -jar
的运行方式在本机执行模拟线上启动方式,在本地复现。
现在可以在本机复现了,那么就在本机边改边测试吧
排查方向
文章还未提交拿不到具体的资源,就执行了刷Lucene操作
细节
一开始按照1的猜想去修改代码,异步事件使用事务事件切实提交后事件,发现没有用。随后,添加日志,发现日志也没有打印。所以,得知根本就没有触发。
对应到代码是a步骤不满足。那么a步骤不满足就是b没有获取到值。现在问题到了,为什么没有获取到值呢?
没有获取到值说明还没有资源,也就是资源还没有生成就去刷Lucene?
解决方法
既然是没有获取到资源,那就先让资源生成,所以使用Order来指定顺序。指定完顺序后,问题解决
github提交: d75683a617f714294f30950bd0d311804ab8ff6d
遗留问题,为什么开发环境不指定顺序却可以拿到Id?
排查后发现是版本问题!!!
生产spring-aop使用的是5.2.2.RELEASE
本地使用的是4.1.4.RELEASE
查阅资料后总结为,从Spring5.2.x开始,Spring AOP不再严格按照AspectJ定义的规则来执行advice,而是根据其类型按照从高到低的优先级进行执行:@Around,@Before ,@After,@AfterReturning,@AfterThrowing
因为未指定顺序,所以比较切面类的字符串
可以得知,是ControllerAspectAdvice
先执行,然后根据下图的执行顺序可以发现确实拿不到资源
至此问题全部解决