@Scheduled 与 ThreadPoolTaskScheduler 行为
@Scheduled with ThreadPoolTaskScheduler behaviour
我有这个作为配置
@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 秒才能完成,因此在至少一个线程完成之前不会安排其他任何事情。
我是否 misunderstand/misconfigure 以某种方式让 3 个线程 运行 并行?
谢谢
所以为了让它并行执行任务,我需要做两件事
1.配置上的@EnableAsync
2、将上面的processMessage注解为@Async如下
@Async
public void processMessages() {
...
}
我有这个作为配置
@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 秒才能完成,因此在至少一个线程完成之前不会安排其他任何事情。
我是否 misunderstand/misconfigure 以某种方式让 3 个线程 运行 并行?
谢谢
所以为了让它并行执行任务,我需要做两件事 1.配置上的@EnableAsync 2、将上面的processMessage注解为@Async如下
@Async
public void processMessages() {
...
}