Как динамически запускать cron в весенней загрузке - PullRequest
1 голос
/ 02 марта 2020

Я создаю приложение при весенней загрузке, которое должно реализовать сложную задачу пакетной обработки, например, есть таблица со всей работой, как показано ниже,

BATCH_JOBS(id, job, cron_expression) 
row count may be huge but job execution time will be very low.

, есть ли способ реализовать это обработка. Допустим, у меня есть @Schedule метод для каждых 5 минут или 10 минут, когда его запуск решит, какое задание необходимо выполнить согласно столбцу cron_expression, и разделит их на потоки. Поток будет запускаться независимо, выполнять столбец задания и сохранять результат в журнал. Заранее спасибо.

1 Ответ

0 голосов
/ 03 марта 2020

Для этого вы можете использовать аннотации @EnableAsync и @Async. например,

@Configuration
@EnableScheduling
public class SpringConfig {
    ...
}

, затем

public class ScheduledFixedRateExample {
    @Async
    @Scheduled(cron = "0 15 10 15 * ?")
    public void scheduleFixedRateTaskAsync() throws InterruptedException {
        System.out.println(
          "Fixed rate task async - " + System.currentTimeMillis() / 1000);
        Thread.sleep(2000);
    }

}

Кредит: https://www.baeldung.com/spring-scheduled-tasks

Можно увеличить размер пула потоков с помощью дополнительной настройки:

package com.example.schedulerdemo.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;

@Configuration
public class SchedulerConfig implements SchedulingConfigurer {
    private final int POOL_SIZE = 10;

    @Override
    public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
        ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler();

        threadPoolTaskScheduler.setPoolSize(POOL_SIZE);
        threadPoolTaskScheduler.setThreadNamePrefix("my-scheduled-task-pool-");
        threadPoolTaskScheduler.initialize();

        scheduledTaskRegistrar.setTaskScheduler(threadPoolTaskScheduler);
    }
}

кредит: https://www.callicoder.com/spring-boot-task-scheduling-with-scheduled-annotation/

Еще один пример использования @Async с заданиями cron: https://javadigest.wordpress.com/2012/06/01/spring-scheduling-using-annotations/

...