Как лучше всего управлять пулами потоков в контейнере? - PullRequest
1 голос
/ 18 мая 2011

Мне нужно иметь возможность выполнять две задачи в потоке в контейнере, и я должен понимать лучшие методы для этого. Вот два класса задач, которые мне нужно выполнить:

  1. Во время вызова веб-служб мне нужно запустить поток, который продолжает обработку после отправки ответа. По завершении обработки сообщение не требуется для исходного отправителя.
  2. При вызове веб-служб может потребоваться создать несколько потоков, которые должны работать параллельно друг другу. Ответ на первоначальный запрос должен быть заблокирован до тех пор, пока все рабочие не выполнят. Элементы ответа будут взяты из фрагментов результатов каждого потока.

Конечно, я мог бы создать свой собственный экземпляр java.util.concurrent.Executor и использовать его, но я подозреваю, что контейнеры могут быть достаточно умными, чтобы предоставить тот, которым они управляют.

FWIW - я использую WebSphere 6.1 на JDK 1.5.0 (я знаю, древний ... но это то, что есть). Я использую веб-сервисы, разработанные с использованием Apache CXF, поэтому я нахожусь в контейнере сервлетов, но настроен на Spring.

Ответы [ 2 ]

1 голос
/ 18 мая 2011

Для 1) вы можете захотеть взглянуть на асинхронные компоненты.В качестве альтернативы используйте компонент, управляемый сообщениями, который принимает и обрабатывает сообщение, которое вы отправляете в очередь.Есть кое-что из кварца из Spring, на которое вы тоже можете посмотреть.Я думаю, что с Servlet 3 (нет шансов на WAS 6.1!) Вы могли бы получить поддержку асинхронизации без подхода Async Work Manager или JMS, но до тех пор я не знаю лучшего способа, чем эти шаблоны.2) вообще блокирование запроса - рискованное дело (что если вы выберете тайм-аут).Тем не менее, вы находитесь в контейнере сервлета, так что вы в порядке, используя что-то из java.util.concurrent, например, ExecutorService, как вы упоминали.В качестве альтернативы используйте обмен сообщениями для отправки работы в другое место и блокировки до ее завершения.

0 голосов
/ 18 мая 2011

Как правило, я бы не стал запускать потоки внутри контейнера, потому что есть вероятность, что полное соответствие j2ee включено, и ваше приложение умрет.При полном соответствии потоки не могут быть созданы.То, что вы хотите сделать, это настроить очередь JMS, в которую вы отправляете свою «работу, которую нужно сделать».Затем вы можете MDB прослушивать очередь, которая выполняет ту фактическую операцию, которую ваш поток сделал бы.

...