0

我有一个自定义的 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来创建一个LockConfigurationExtractorbean。

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

有没有其他方法来定义/获取DefaultLockManagerbean?


编辑

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

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

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

4

2 回答 2

2

我找到了解决方法。我级联了两个可运行文件并将第二个传递给该TaskScheduler schedule(...)方法。大致看起来像这样:

        Runnable runnable1 = () -> someMethod();

        Runnable runnable2 = () -> { 
            LockingTaskExecutor executor = new DefaultLockingTaskExecutor(lockProvider);
            Instant lockAtMostUntil = Instant.now().plusSeconds(600);
            executor.executeWithLock(runnable1, new LockConfiguration(<lock_name>, lockAtMostUntil));
        };
 
        CronTrigger cronTrigger = new CronTrigger(<cron-expression>, TimeZone.getTimeZone(TimeZone.getDefault().getID()));    
        ScheduledFuture<?> scheduledTask = scheduler.schedule(runnable2, cronTrigger);
于 2021-01-14T16:01:57.930 回答
1

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

于 2021-01-16T12:12:09.283 回答