@ Запланировано с поведением ThreadPoolTaskScheduler - PullRequest
0 голосов
/ 02 ноября 2018

У меня есть это как конфигурация

 @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 потока работали параллельно?

Спасибо

1 Ответ

0 голосов
/ 03 ноября 2018

Итак, чтобы он мог выполнять задачи параллельно, мне нужно было сделать 2 вещи 1. @EnableAsync в конфигурации 2. Добавьте аннотацию processMessage выше с помощью @Async, как показано ниже

@Async
public void processMessages() {
  ...
}
...