2012-05-09 3 views
3

Вот мой прецедент.Правильный способ многопоточности внутри Tomcat/Jetty

  1. Клиент отправляет запрос на сервер.
  2. Серверу необходимо выполнить следующие действия: 2.a. Сделайте сетевой вызов, чтобы получить некоторые данные (D).
    2.b. Создайте процессор (P) для обработки данных.
  3. Р обрабатывает D и отправляет ответ обратно клиенту

Создание процессор стоит дорого (около порядка 1-3 секунд.) Но это не зависит от данных Д.

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

Я никогда не делал многопоточное программирование внутри сервера приложений. Мой вопрос - лучший способ борьбы с потоками внутри сервера приложений (в частности, Tomcat и Jetty)

Спасибо.

+1

Не могли бы вы объединить экземпляры процессора? – Jeremy

+0

Не всегда. Потому что процессор зависит от состояния в моем запросе, который «может» меняться каждый раз. –

ответ

5

ИМО лучше всего использовать рамки Executor. Это облегчает работу с параллелизмом.

couple oftutorials для того, чтобы вы начали.

Тот факт, что ваш код работает внутри веб-контейнера, такого как Tomcat, не должен вас слишком беспокоить. Это означает, что фактический поток, обрабатывающий запрос, фактически является рабочим потоком, взятым из пула потоков, управляемого самим сервером приложений. Тем не менее, до тех пор, пока ваши собственные потоки выполняют свою работу чисто (т. Е. Только модифицируют данные, ограниченные этим фактическим запросом, и не мешают другим, внешним потокам), и их не так много, в то же время все должно будь умницей.

4

Tomcat 7 поддерживает сервлет 3.0 и это асинхронные сервлеты - он поддерживает собственный пул потоков и предоставляет стандартный API для выполнения запросов в отдельных потоках. Вы можете видеть здесь пример: Async Servlets in Tomcat 7

+1

Я просто выброшу, что jetty 8 также поддерживает сервлет 3.0. И в конечном итоге вы должны принять стандартный подход, а не на заказную реализацию, по крайней мере, если вы собираетесь перенести серверный api в первую очередь. –

+0

Будет ли это работать с весной? –

+0

Насколько мне известно, Spring MVC пока этого не поддерживает. Вы также не можете использовать autowiring в таком сервлете, но вы можете получить весенний контекст со следующим кодом и получить от него свои бобы: ServletContext context = getServletContext(); WebApplicationContext applicationContext = WebApplicationContextUtils.getWebApplicationContext (контекст); –

0

Если создание процессора (P) стоит дорого, можете ли вы создать пул экземпляров P и повторно использовать их так же, как создать пул соединений с базой данных?

Проект Apache Commons Pool может дать вам начальную точку.

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