BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / java / #65250同步于 2021/6/7
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖

为什么@Scheduled和@Transactional同时存在,定时任务就失效了

buptsyf
2021/6/7镜像同步11 回复
rt。lz发现在同一个类中,如果同时存在@Scheduled和@Transactional注解,则无法触发定时任务,去掉@Transactional定时任务就出来了。。。 @Service @EnableScheduling public class TestService { @Scheduled(cron = "0/3 * * * * *") public void print(){ System.out.println(System.currentTimeMillis()); } // @Transactional(rollbackFor = Exception.class) public void trans(){ System.out.println("trans"); } } //像上面这样就可以正常触发,如果去掉@Transactional的注释,定时任务就失效了[ema1],求大佬帮忙看看
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
leozhao机器人#1 · 2021/6/7
这个得看源码才可以解释
LeesangHyuk机器人#2 · 2021/6/7
到底失效没失效? 而且上面这个仅仅是做了Print()函数的定时任务吧?
zxk422机器人#3 · 2021/6/7
应该是这样的吧, @Scheduled和@Transactional生成的代理过程不同,Scheduled和Async仅仅BeanpostProcessor,Transactional还继承了abstractAutoCreatetorProxy,这样生成代理的时候,在三级缓存暴漏的时候,会先生成代理,而Scheduled和Async仅仅在BeanpostProcessor处理的时候,查找相应的方法,然后生成代理,加入设定好的线程池中。
buptsyf机器人#4 · 2021/6/7
[ema1] 【 在 leozhao 的大作中提到: 】 : 这个得看源码才可以解释
buptsyf机器人#5 · 2021/6/7
两个注解都有就会失效。只是一个demo[ema1] 【 在 LeesangHyuk 的大作中提到: 】 : 到底失效没失效? 而且上面这个仅仅是做了Print()函数的定时任务吧?
buptsyf机器人#6 · 2021/6/7
感谢大佬,好细致,我研究研究 【 在 zxk422 的大作中提到: 】 : 应该是这样的吧, @Scheduled和@Transactional生成的代理过程不同,Scheduled和Async仅仅BeanpostProcessor,Transactional还继承了abstractAutoCreatetorProxy,这样生成代理的时候,在三级缓存暴漏的时候,会先生成代理,而Scheduled和Async仅仅在BeanpostProcessor处理的时候,查找相应的方法,然后生成代理,加入设定好的线程池中。 : --
cmpara机器人#7 · 2021/6/8
可以这么理解 1. @Scheduled 相当于是 this 调用,自己调用自己,没有经过spring 的 aop 2. @Transactional 是通过 aop 实现的 综上,调用失败 可以看下@Transactional 的几种失效案例,老八股文了
cmpara机器人#8 · 2021/6/8
解决方案:两个注解别同时用,新起一个类以及方法,在方法上+@Transactional
leozhao机器人#9 · 2021/6/8
【 在 buptsyf 的大作中提到: 】 : rt。lz发现在同一个类中,如果同时存在@Scheduled和@Transactional注解,则无法触发定时任务,去掉@Transactional定时任务就出来了。。。 : @Service : @EnableScheduling : ................... 可以看一下附件,源码的实现方式