У меня есть это как конфигурация
@Bean
public ThreadPoolTaskScheduler taskScheduler() {
ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
taskScheduler.setPoolSize(3);
taskScheduler.setThreadNamePrefix("worker-thread-");
return taskScheduler;
}
Poller.java, который опрашивает каждые 100 миллисекунд
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@Component
@Slf4j
public class Poller {
private Processor processor
@Autowired
public SqsPoller(Processor processor) {
this.processor = processor;
}
@Scheduled(fixedRate = 100)
public void poll() throws InterruptedException {
log.info("polling");
processor.processMessages();
}
}
Processor.java, который делает что-то, что занимает 5 секунд или около того, например
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
@Slf4j
@Component
public class Processor {
public void processMessages() throws InterruptedException {
log.info("processing message and sleep 5 seconds");
Thread.sleep(5000);
}
}
Когда я запускаю его, это вывод
2018-11-02 21:13:43.029 INFO 6642 --- [ worker-thread-1]: polling
2018-11-02 21:13:43.029 INFO 6642 --- [ worker-thread-1]: processing message and sleep 5 seconds
2018-11-02 21:13:48.034 INFO 6642 --- [ worker-thread-2]: polling
2018-11-02 21:13:48.035 INFO 6642 --- [ worker-thread-2]: processing message and sleep 5 seconds
2018-11-02 21:13:53.037 INFO 6642 --- [ worker-thread-2]: polling
2018-11-02 21:13:53.037 INFO 6642 --- [ worker-thread-2]: processing message and sleep 5 seconds
....
2018-11-02 21:14:53.078 INFO 6642 --- [ worker-thread-1]: polling
2018-11-02 21:14:53.078 INFO 6642 --- [ worker-thread-1]: processing message and sleep 5 seconds
2018-11-02 21:14:58.081 INFO 6642 --- [ worker-thread-1]: polling
2018-11-02 21:14:58.082 INFO 6642 --- [ worker-thread-1]: processing message and sleep 5 seconds
2018-11-02 21:15:03.086 INFO 6642 --- [ worker-thread-1]: polling
2018-11-02 21:15:03.087 INFO 6642 --- [ worker-thread-1]: processing message and sleep 5 seconds
....
2018-11-02 21:16:38.148 INFO 6642 --- [ worker-thread-1]: polling
2018-11-02 21:16:38.148 INFO 6642 --- [ worker-thread-1]: processing message and sleep 5 seconds
2018-11-02 21:16:43.153 INFO 6642 --- [ worker-thread-2]: polling
2018-11-02 21:16:43.153 INFO 6642 --- [ worker-thread-2]: processing message and sleep 5 seconds
....
2018-11-02 21:21:48.339 INFO 6642 --- [ worker-thread-3]: polling
2018-11-02 21:21:48.339 INFO 6642 --- [ worker-thread-3]: processing message and sleep 5 seconds
2018-11-02 21:21:53.345 INFO 6642 --- [ worker-thread-3]: polling
2018-11-02 21:21:53.345 INFO 6642 --- [ worker-thread-3]: processing message and sleep 5 seconds
Как видите, многопоточности не происходит, похоже, что поток 1 опрашивает и обрабатывает, и либо сам начинает опрос и обработку снова, либо другой поток, но в любой момент времени выполняется только один.
Я бы подумал, что по крайней мере 3 потока выполняются параллельно, потому что для запуска 3 потоков потребуется всего 300 миллисекунд. Каждый из них занимает 5 секунд, поэтому больше ничего не запланировано, пока не завершится хотя бы один поток.
Неужели я как-то неправильно понял / неправильно настроил, чтобы 3 потока работали параллельно?
Спасибо