Как запустить метод @Scheduled с конкретным планировщиком? - PullRequest
0 голосов
/ 05 сентября 2018

У меня есть планировщик:

@Bean("one")
ThreadPoolTaskScheduler taskScheduler(){
    ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler();
    threadPoolTaskScheduler.setPoolSize(5);
    threadPoolTaskScheduler.setAwaitTerminationSeconds(60);
    threadPoolTaskScheduler.setThreadNamePrefix("Test-");
    return threadPoolTaskScheduler;
}

@Bean("two")
ThreadPoolTaskScheduler taskScheduler2(){
    ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler();
    threadPoolTaskScheduler.setPoolSize(50);
    threadPoolTaskScheduler.setAwaitTerminationSeconds(60);
    threadPoolTaskScheduler.setThreadNamePrefix("Test2-");
    return threadPoolTaskScheduler;
}

И метод:

@Scheduled(fixedRate = 1000L)
public void test() {

И Второй метод:

@Scheduled(fixedRate = 1000L)
public void test2() {

Как настроить каждый @Scheduled метод с конкретным планировщиком?

Если я реализую это так:

@Slf4j
@Component
public class MyScheduler {

    private final ThreadPoolTaskScheduler taskSchedulerFirst;
    private final ThreadPoolTaskScheduler taskSchedulerSecond;
    private final TestBean testBean;

    public MyScheduler(@Qualifier("first") ThreadPoolTaskScheduler taskSchedulerFirst, @Qualifier("second")ThreadPoolTaskScheduler taskSchedulerSecond, TestBean testBean) {
        this.taskSchedulerFirst = taskSchedulerFirst;
        this.taskSchedulerSecond = taskSchedulerSecond;
        this.testBean = testBean;
    }

    @PostConstruct
    public void test() {
        taskSchedulerFirst.scheduleAtFixedRate(testBean::test, 1000L);
        taskSchedulerSecond.scheduleAtFixedRate(testBean::test2, 1000L);
    }

Планировщики рта не используются и не используются TaskExecutor:

2018-09-05 11:10:30.812  INFO 10724 --- [TaskExecutor-41] com.example.scheduling.TestBean          : hz
2018-09-05 11:10:31.747  INFO 10724 --- [TaskExecutor-43] com.example.scheduling.TestBean          : hz
2018-09-05 11:10:31.748  INFO 10724 --- [TaskExecutor-46] com.example.scheduling.TestBean          : hz2
2018-09-05 11:10:32.747  INFO 10724 --- [TaskExecutor-45] com.example.scheduling.TestBean          : hz
2018-09-05 11:10:32.748  INFO 10724 --- [TaskExecutor-48] com.example.scheduling.TestBean          : hz2
2018-09-05 11:10:33.747  INFO 10724 --- [TaskExecutor-47] 

Но использовал TaskExecutor почему?

Ответы [ 3 ]

0 голосов
/ 05 сентября 2018

Вам необходимо реализовать SchedulingConfigurer в классе конфигурации и переопределить его configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) метод. В переопределенном методе зарегистрируйте ваш ThreadPoolTaskScheduler:

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

        scheduledTaskRegistrar.setTaskScheduler(threadPoolTaskScheduler);
    }
0 голосов
/ 05 сентября 2018

При использовании аннотации @Scheduled отсутствует встроенная поддержка использования разных пулов потоков для разных bean-компонентов. Вы можете настроить пул потоков, используя SchedulingConfigurer в своем классе @Configuration.

Я думаю, что реализация после вашего редактирования должна работать. Вам, вероятно, нужно только вызвать threadPoolTaskScheduler.initialize() непосредственно после создания планировщика следующим образом:

@Bean("two")
ThreadPoolTaskScheduler taskScheduler2(){
    ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler();
    threadPoolTaskScheduler.initialize(); // initialize scheduler
    threadPoolTaskScheduler.setPoolSize(50);
    threadPoolTaskScheduler.setAwaitTerminationSeconds(60);
    threadPoolTaskScheduler.setThreadNamePrefix("Test2-");
    return threadPoolTaskScheduler;
}

Это создаст внутреннего исполнителя планировщика, который будет использовать фактически выполняемый материал.

0 голосов
/ 05 сентября 2018

TL; DR Нет

Согласно Spring планирования это разные реализации абстракции TaskScheduler

  1. ThreadPoolTaskScheduler как реализация:

    ThreadPoolTaskScheduler, может использоваться, когда управление внешним потоком не является обязательным требованием. Внутренне он делегирует экземпляру ScheduledExecutorService. ThreadPoolTaskScheduler фактически реализует также интерфейс TaskExecutor в Spring, так что один экземпляр можно использовать для асинхронного выполнения как можно скорее, а также для запланированных и потенциально повторяющихся выполнений.

  2. @ Запланировано как поддержка аннотаций для планирования задач

Аннотация @Scheduled может быть добавлена ​​в метод вместе с метаданными триггера.

См. Также ответ для лучшего способа планирования задачи , большинство проголосовавших:

Самым простым способом планирования задач в Spring является создание метода, аннотируемого @Scheduled в Spring Управляемый компонент.

...