问题描述
我有一个自定义的 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。
附言我浏览了源代码和测试用例。但是 LockConfigurationExtractor
似乎没有在库包之外可访问的公共具体实现。
还有其他方法可以定义/获取 DefaultLockManager
bean 吗?
编辑:
实际上我的主要目标根本不是创建 LockableTaskScheduler。我只是想以某种方式安排一个“可锁定”运行:
ScheduledFuture<?> scheduledTask = lockableTaskScheduler.schedule(<lockable_runnable>,crontrigger);
所以当 runnable 被触发时,它不能同时在另一个节点中运行。 (注意:业务逻辑的动态/程序化调度部分是无法避免的ATM)
解决方法
您可以使用 LockableTaskScheduler
,但您必须实现自己的 LockConfigurationExtractor
- 通用的将无法从您的可运行文件中提取锁定配置。一种可能的实现是使用返回 Runnable
的方法扩展 LockConfiguration
。 LockConfigurationExtractor
只会从 runnable 中获取它。