我有多个生产者和单个消费者的阻塞队列(足以进行项目的后期处理)。
生产者按计划启动,将任务发送到执行程序池,然后由工作人员将任务添加到队列中。
关于如何启动消费者线程的问题?
现在我有@EventListener(SpringBoot)发送启动到singleThreadExecutorPool方法,该方法在无限循环中为队列服务,对于这种情况可能存在更好的解决方案。看起来像消耗队列的常见模式。
答案 0 :(得分:1)
你的方法非常好。 这是我个人用于此类案件的模式。
@Component
public class ConsumerTask implements Runnable {
private ExecutorService executorService;
private BlockingQueue<Object> queue;
// use dependency injection if needed
public ConsumerTask(BlockingQueue<Object> queue) {
executorService = Executors.newSingleThreadExecutor();
this.queue = queue;
}
@PostConstruct
public void init() {
executorService.execute(this);
}
@PreDestroy
public void destroy() {
// unlike shutdown() shutdownNow() sends interruption to running tasks
executorService.shutdownNow();
}
@Override
public void run() {
try {
while (true) {
Object o = queue.take();
// process o
}
} catch (InterruptedException e) {
// we were interrupted by shutdownNow(), restore interrupted status and exit
Thread.currentThread().interrupt();
}
}
}