无法在 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)

解决方法

您可以使用 LockableTaskScheduler,但您必须实现自己的 LockConfigurationExtractor - 通用的将无法从您的可运行文件中提取锁定配置。一种可能的实现是使用返回 Runnable 的方法扩展 LockConfigurationLockConfigurationExtractor 只会从 runnable 中获取它。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...