Как провести очередь сообщений и иметь группу рабочих потоков без опроса? - PullRequest
2 голосов
/ 18 марта 2010

У меня есть рабочий процесс, который я хочу выглядеть примерно так:

                                         / Worker 1 \
=Request Channel= -> [Holding Queue|||] -> Worker 2 -> =Response Channel=
                                         \ Worker 3 /

То есть:

  • Приходят запросы, и они входят в очередь FIFO
  • Идентичные рабочие затем выбирают задачи из очереди
  • В любой момент времени любой работник может выполнить только одно задание
  • Когда работник свободен, а очередь хранения не пуста, работник должен немедленно приступить к другой задаче
  • Когда задачи завершены, работник помещает результат в Response Channel

Я знаю, что в Spring Integration есть QueueChannel, но эти каналы требуют опроса (что кажется неоптимальным). В частности, если работник может быть занят, я бы хотел, чтобы работник был занят.

Кроме того, я рассмотрел возможность вообще избегать очереди и просто разрешать круговые задания всем работникам, но предпочтительно иметь одну очередь ожидания, поскольку некоторые задачи могут выполняться быстрее, чем другие. Кроме того, я хотел бы узнать, сколько осталось рабочих мест (которые я могу получить из очереди) и возможность отмены всех или отдельных заданий.

Как я могу реализовать этот шаблон очереди сообщений / распределения работы, избегая опроса?

Редактировать: Похоже, я ищу шаблон диспетчера сообщений - как я могу реализовать это с помощью интеграции Spring / Spring?

Ответы [ 2 ]

3 голосов
/ 08 мая 2010

В Spring Integration 2.0.0 мы добавили подэлемент <dispatcher/> к элементу <channel/>. Вы можете использовать это для обеспечения асинхронной передачи обслуживания без использования опроса.

Это использует java.util.concurrent внизу.

<channel id="shareableWork">
    <dispatcher task-executor="pool"/>
</channel>
<thread-pool-task-executor id="pool" max-size="3"/>
2 голосов
/ 18 марта 2010

Возможно, вам следует взглянуть на классы ExecutorService из пакета параллелизма.

...