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();
    }
  }
}
Другие вопросы по тегам