Shedlock使用PROXY_METHOD模式完全不执行锁定问题求助
Shedlock PROXY_METHOD不生效但PROXY_SCHEDULER正常的原因及解决办法
核心原因:PROXY_METHOD的工作机制限制
- PROXY_METHOD是靠Spring AOP代理拦截带
@SchedulerLock的方法,它要求被拦截方法所在的类是普通Spring Bean(不能是@Configuration类),且方法调用必须通过代理对象触发。 - 你把定时方法
fooScheduledTask()直接写在了ApplicationConfiguration这个@Configuration类里,Spring对@Configuration类的代理逻辑只针对@Bean方法的懒加载、循环依赖处理,不会为类里的@Scheduled方法生成AOP代理来拦截@SchedulerLock注解,所以锁逻辑完全不执行。
PROXY_SCHEDULER为什么能正常工作
- PROXY_SCHEDULER是直接拦截Spring的TaskScheduler调度器本身,不管定时方法在哪个类里,只要是Spring调度器执行的任务,都会被拦截并添加锁逻辑。它不依赖目标类的AOP代理,自然能绕过
@Configuration类的代理限制。
解决PROXY_METHOD不生效的办法
把定时方法移到单独的普通Spring Bean类里,别放在@Configuration类中:
@Component // 普通Spring组件类 public class FooScheduledTasks { @Autowired private FooService fooService; @Scheduled(cron = "0 * * * * *") @SchedulerLock(name = "fooSchedulerLock", lockAtLeastFor = "10m", lockAtMostFor = "15m") public void fooScheduledTask() { fooService.doStuff(); } }
然后修改原配置类,移除里面的定时方法:
@Slf4j @Configuration @EnableTransactionManagement @EnableScheduling @EnableSchedulerLock(defaultLockAtMostFor = "PT5M", interceptMode = InterceptMode.PROXY_METHOD) public class ApplicationConfiguration { @Bean public LockProvider lockProvider(DataSource dataSource) { return new JdbcTemplateLockProvider( JdbcTemplateLockProvider.Configuration.builder() .withTableName("public.shedlock") .withJdbcTemplate(new JdbcTemplate(dataSource)) .usingDbTime() .build() ); } }
关于PROXY_SCHEDULER的顾虑
PROXY_SCHEDULER本身是稳定的,它会拦截所有Spring调度的任务,但只要你的定时方法都正确添加了@SchedulerLock注解,就不会有额外问题。就算有未加注解的定时任务,Shedlock也会自动忽略,不会产生影响。
内容的提问来源于stack exchange,提问作者Sovak
相关产品推荐
相关产品推荐

