Java - однопотоковый исполнитель
У меня есть очередь блокировки с несколькими производителями и одним потребителем (этого достаточно для постобработки предметов).
Производители запускаются по расписанию, которые отправляют задачи в пул исполнителей, а затем задачи добавляются работниками в очередь.
Мой вопрос о том, как начать потребительскую ветку?
На данный момент у меня есть @EventListener (SpringBoot), который отправляет при запуске метод singleThreadExecutorPool, который обслуживает очередь в бесконечном цикле while, возможно, для этого случая существует лучшее решение. Похоже, довольно распространенный шаблон для потребления очереди.
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();
}
}
}