You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 23:51:00