无法在 ShedLock 中创建 LockManager bean

问题描述

我有一个自定义的 ThreadPoolTask​​Scheduler,我想在我在配置中定义的 LockableTaskScheduler 实例中使用它,如下所示:

@Configuration
public class ApplicationConfiguration {

    @Autowired DataSource dataSource;

    @Bean
    public LockProvider lockProvider() {
        return new JdbcTemplateLockProvider(
                JdbcTemplateLockProvider.Configuration.builder()
                        .withJdbcTemplate(new JdbcTemplate(dataSource))
                        .usingDbTime()
                        .build()
        );
    }

    @Bean
    public TaskScheduler lockableTaskScheduler(){
           ThreadPoolTaskScheduler threadPoolTaskScheduler = new 
           ThreadPoolTaskScheduler();
           threadPoolTaskScheduler.setPoolSize(2);
           threadPoolTaskScheduler.initialize();
           return new LockableTaskScheduler(threadPoolTaskScheduler,lockManager());
    }

    @Bean
    public LockManager lockManager(){
        return new DefaultLockManager(lockProvider(),lockConfigurationExtractor());
    }

    @Bean /*** PROBLEM HERE ***/
    public LockConfigurationExtractor lockConfigurationExtractor(){
        return new SpringLockConfigurationExtractor();
    }
}

我以编程方式实例化动态计划,如下所示:

@Autowired
TaskScheduler lockableTaskScheduler;
...    
CronTrigger cronTrigger = new CronTrigger(cronExpression,TimeZone.getTimeZone(TimeZone.getDefault().getID()));
    Runnable runnable = () -> someMethod();
    ScheduledFuture<?> scheduledTask = lockableTaskScheduler.schedule(runnable,cronTrigger);

但我找不到任何 LockConfigurationExtractor 的公共实现来创建 LockConfigurationExtractor bean。

附言我浏览了源代码和测试用例。但是 LockConfigurationExtractor 似乎没有在库包之外可访问的公共具体实现。

还有其他方法可以定义/获取 DefaultLockManager bean 吗?


编辑

实际上我的主要目标根本不是创建 LockableTaskScheduler。我只是想以某种方式安排一个“可锁定”运行:

ScheduledFuture<?> scheduledTask = lockableTaskScheduler.schedule(<lockable_runnable>,cronTrigger);

所以当 runnable 被触发时,它不能同时在另一个节点中运行。 (注意:业务逻辑的动态/程序化调度部分是无法避免的ATM)

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)