jetcache 方法启用定时刷新后spring aop 失效了

fjnneemd  于 2022-11-06  发布在  Spring
关注(0)|答案(8)|浏览(158)

大佬请教一下,如题,我在service 层的方法中启用了定时刷新。项目用了spring AOP 做了个动态数据源的读写分离。对于selectXXX的service 层方法做了拦截让它去从库查询,但是定时刷新调用的selectXXX的servie方法却不走AOP, 直接用了默认的写库。如何在定时刷新的方法仍然走AOP

uqdfh47h

uqdfh47h1#

你们的读从库的标记是不是写在ThreadLocal上了,自动刷新在另外的线程池里面执行,这个标记肯定就读不到了。

gr8qqesn

gr8qqesn2#

是的,标记在threadlocal上了,但是这只是个线程安全的本地变量标识吧,其它线程读它aop生效也可以哇,如果我不用tjreadlocal了是否就可以

yi0zb3m4

yi0zb3m43#

jetcache也是用spring aop实现的,你的切面如果在jetcache切面的外层肯定是不行的;如果在内层,有可能会可以,但我没试过。

EnableMethodCache可以设置order属性。

yqhsw0fo

yqhsw0fo4#

多谢回答,优先级我看jetcahce 是最低的。切换数据源的优先级最高,事务切面其次,最后是jetcache 按理说是没有问题的。回头我调试一下再反馈

ljo96ir5

ljo96ir55#

调试了一下,跟优先级别还没有关系。就是感觉定时刷新的代理方法直接调用 service不会再被AOP 拦截。

ipakzgxi

ipakzgxi6#

补充一下,我如果把service 再包一层,是可以的。动态切换数据源会生效

xkftehaa

xkftehaa7#

那么spring aop的invocation.proceed方法是有状态的,第二次调用和第一次调用是有差异的,之前忽略这个了,这还不太好解决呢

zxlwwiss

zxlwwiss8#

嗯,我觉得不要紧,可以通过 Package 方法来规避

相关问题