Java – How do I start @Scheduled method using a concrete scheduler?

How do I start @Scheduled method using a concrete scheduler?… here is a solution to the problem.

How do I start @Scheduled method using a concrete scheduler?

I have a scheduler :

@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;
}

and Method:

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

Second method:

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

How do I configure each @Scheduled method with a specific scheduler?

If I implement it this way:

@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);
    }

Two schedulers that do not use and use task executors:

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] 

But why did you use TaskExecutor?

Solution

TL;DR No

According to Spring scheduling They are different implementations of the TaskScheduler abstraction

  1. ThreadPoolTaskScheduler as implementation:

    ThreadPoolTaskScheduler, can be used whenever external thread management is not a requirement. Internally, it delegates to a ScheduledExecutorService instance. ThreadPoolTaskScheduler actually implements Spring’s TaskExecutor interface as well, so that a single instance can be used for asynchronous execution as soon as possible as well as scheduled, and potentially recurring, executions.

  2. @Scheduled annotation support for task scheduling

The @Scheduled annotation can be added to a method along with trigger metadata.

See also answer for Best way to schedule task, the most votes:

The simplest way to schedule tasks in Spring is to create method annotated by @Scheduled in spring managed bean.

Related Problems and Solutions