1

У меня есть следующий проект:Java ScheduledExecutorService производителя потребитель

Spring (3.2) основа веб-приложение (Tomcat 7), в фоновом режиме, у меня есть несколько задач.

У меня есть очередь с некоторой информацией для обработки. Эта очередь периодически обновляется (но только когда она пуста).

Также у меня есть несколько потоков, которые периодически выдают данные из этой очереди и процесса.

Для планирования я хотел использовать ScheduledExecutorService.

У меня есть несколько проблем \ вопросов:

  1. Как сохранить эту очередь? По-моему, это должно быть глобальным. Должен ли я сделать его статическим в каком-то классе «держатель»? Не будет ли это плохой настрой?

  2. Где будет место для инициализации этой очереди и всей задачи с помощью ScheduledExecutorService? Является ли ServletContextLoadingListener хорошим местом для этого? Есть ли способы начать это с Spring?

  3. Должен ли я использовать несколько экземпляров ScheduledExecutorService, если мне нужно точно контролировать количество потребительских потоков?

  4. Будет ли ArrayBlockingQueue хорошим для этого случая?

ответ

1
  1. Вы можете использовать обычный класс, и пусть весна управлять с областью singleton.
  2. Вы можете настроить компонент с помощью init-method в конфигурации весны или реализовать интерфейс InitializingBean в своем классе.
  3. Номер потока для ScheduledExecutorService настраивается с помощью аргументов конструктора. Если у вас есть задачи нескольких типов и вы хотите запускать их в отдельных пулах потоков, вы можете использовать несколько экземпляров ScheduledExecutorService. Однако, если все ваши задачи одного типа, я не вижу необходимости в нескольких экземплярах ScheduledExecutorService.
  4. ScheduledThreadPoolExecutor, предоставляемый внутри JDK, имеет внутреннюю рабочую очередь класса java.util.concurrent.ScheduledThreadPoolExecutor.DelayedWorkQueue.DelayedWorkQueue (и он не настраивается). Я не уверен, где вы кладете ArrayBlockingQueue.
+0

Спасибо, около 4-го пункта, мне нужно иметь обновляемую очередь с некоторым количеством данных для обработки рабочими потоками, так как я понимаю, что DelayedWorkQueue находится внутри ScheduledExecutorService, и это для рабочих потоков, которые я отправляю туда. –

Смежные вопросы