2015-02-01 5 views
0

Итак, у меня есть эта старая служба JAX-WS, которая выполняет много ввода-вывода для каждого запроса, поэтому каждый запрос занимает довольно много времени, но не потребляет много CPU/RAM.JAX-WS с асинхронными сервлетами

С увеличением количества клиентов в последнее время существует огромная проблема голодания нитей.

Сначала я подумал о внедрении встроенной асинхронной поддержки JAX-WS, но для этого клиенты должны знать об этом, и это не так. Я не могу заставить их всех обновить свой код.

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

Можно ли использовать поддержку async для сервлета 3.1 при обработке запросов JAX-WS?

Я должен уточнить, что я не могу использовать какую-то очередь или иначе «просто вернусь раньше», потому что обработка запроса может завершиться неудачей, и клиент должен получить этот сбой.

+0

Зачем нужен сервлет для обработки JAX-WS? – SMA

+0

Потому что я хочу обрабатывать запрос асинхронно, например, в https://webtide.com/servlet-3-1-async-io-and-jetty/ – tobber

ответ

1

Я нашел решение, которое отлично работает для меня, API непрерывных операций CXF.

http://cxf.apache.org/docs/continuations.html

https://github.com/search?l=java&q=ContinuationProvider&type=Code&utf8=%E2%9C%93

мне пришлось включить асинхр для CXF Servlet, а также добавить JBoss зависимость модуля в комплекте CXF.

В то время как все это выглядит как взломанный, это позволило мне выполнить правильную асинхронную обработку без изменения внешнего API-интерфейса службы. В качестве бонуса я могу даже решить, следует ли приостанавливать запрос или обрабатывать его в обычном режиме, что очень помогает в определенных случаях.

0

Вы можете использовать рабочий процесс здесь, где говорят, что сотрудники веб-сервера принимают запрос, обрабатывают его и помещают в очередь, которая совместно используется потоком, который будет обрабатывать это событие асинхронно.

Это означало бы, что у вас есть небольшое время ожидания на стороне клиента и вы обрабатываете запрос клиента асинхронно. Таким образом, вы создаете свою масштабируемую систему и можете увеличить количество рабочих потоков на любом из сторон, то есть на веб-сервере, чтобы одновременно принимать несколько запросов от клиента, и в то же время несколько потоков могут одновременно обрабатывать события от клиента.

+0

На самом деле это одна из тех вещей, о которых я сразу думал. Проблема в том, что обработка запросов может завершиться неудачей, и клиент должен получить этот отказ в качестве ответа. – tobber

+0

Разве это не синхронный запрос/ответ, который вам нужен? Если ваш клиент не сможет обработать ответ асинхронно. – SMA

+0

Я хочу, чтобы мои клиенты продолжали использовать сервис, как если бы он был синхронным, но используют асинхронную обработку на стороне сервера. Например, посмотрите, как Play! Framework, где клиенты отправляют добрые старые http-запросы, но обработка может выполняться асинхронно с Future's и все такое. – tobber