我有一个自定义的 ThreadPoolTaskScheduler,我想在我在配置中定义的 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。
PS我浏览了源代码和测试用例。但LockConfigurationExtractor
似乎在库包之外没有可访问的公共具体实现。
有没有其他方法来定义/获取DefaultLockManager
bean?
编辑:
实际上,我的主要目标根本不是创建 LockableTaskScheduler。我只想以某种方式安排“可锁定”可运行:
ScheduledFuture<?> scheduledTask = lockableTaskScheduler.schedule(<lockable_runnable>, cronTrigger);
这样当 runnable 被触发时,它就不能在另一个节点上同时运行。(注:业务逻辑中的动态/程序化调度部分是无法避免的ATM)