Javax.xml.ws.Endpoint, как это работает с несколькими подключениями? - PullRequest
4 голосов
/ 19 июня 2010

Когда вы используете javax.xml.ws.Endpoint.publish для обработки входящих запросов restful / soap, будет ли он генерировать поток для каждого запроса? или я сам буду обрабатывать темы?

Я пытался решить это в течение нескольких дней. Документация намекает на темы, но в этом нет ничего конкретного.

Док говорит:

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

Для меня это выглядит так, как будто он обрабатывает потоки, но вы не будете контролировать их, поэтому добавив ThreadPoolExecutor для выполнения потоков, вы получите пул потоков, с которыми вы можете работать. Это правильно?

Ответы [ 4 ]

4 голосов
/ 19 июня 2010

Исследовательский раздел 5.2.7 JavaTM API для спецификации Web-сервисов на основе XML (JAX-WS), кажется, указывает на это, хотя похоже, что для специфичное для реализации поведение. Чтобы действительно знать, что происходит, вам нужно изучить используемую вами реализацию JAX-WS и конкретную среду развертывания. Я полагаю, что поведение может отличаться в зависимости от того, развернута ли служба в контейнере сервлета или в автономном процессе. Контроль, который у вас есть над потоками, ограничен предоставлением конкретной ThreadPoolExecutor реализации. Раздел 5.2.7 гласит:

5.2.7 Исполнитель

Endpoint экземпляры могут быть сконфигурированы с помощью java.util.concurrent.Executor. Затем исполнитель будет использоваться для отправки любых входящих запросов в приложение. Методы setExecutor и getExecutor Endpoint могут использоваться для изменения и получения исполнителя, настроенного для службы.

<> Соответствие (использование Executor): Если объект исполнителя успешно установлен на Endpoint с помощью метода setExecutor, то реализация ДОЛЖНА использовать его для отправки входящих запросов после публикации Endpoint с помощью метода publish(String address). Если публикация выполняется с использованием метода publish(Object serverContext)), реализация МОЖЕТ использовать указанного исполнителя или другого, определенного для используемого контекста сервера.

<> Соответствие (Исполнитель по умолчанию): Если исполнитель не был установлен на Endpoint, реализация ДОЛЖНА использовать своего собственного исполнителя, java.util.concurrent.ThreadPoolExecutor или аналогичный механизм, для отправки входящих запросов .

Также в разделе 5.2.2 ссылки 5.2.7 в конце раздела:

5.2.2 Публикация

...

Endpoint обычно вызывается для обслуживания одновременных запросов, поэтому его разработчик должен быть написан так, чтобы поддерживать несколько потоков. Ключевое слово synchronized может использоваться, как обычно, для контроля доступа к критическим разделам кода. Для более точного управления потоками, используемыми для отправки входящих запросов, приложение может напрямую установить исполнителя, который будет использоваться, как описано в разделе 5.2.7.

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

3 голосов
/ 25 ноября 2011

Исполнитель должен быть установлен , чтобы конечная точка была многопоточной.Простым многопоточным исполнителем будет исполнитель с фиксированным пулом потоков.

endpoint.setExecutor(Executors.newFixedThreadPool(4));

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

1 голос
/ 12 декабря 2012

Endpoint.publish (Url, ServiceImplObj) публикует веб-сервис по указанному URL-адресу. Нет. потоков, назначенных для обработки запросов, действительно находится под контролем jvm, потому что это легковесное развертывание, которое обрабатывается самой jvm.

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

[pool-1-thread-1]: Response[57]:
[pool-1-thread-5]: Response[58]:
[pool-1-thread-4]: Response[59]:
[pool-1-thread-3]: Response[60]:
[pool-1-thread-6]: Response[61]:
[pool-1-thread-6]: Response[62]:

Я использовал jdk1.6.0_35

xjc-версия xjc версия "JAXB 2.1.10 в JDK 6" Ссылочная реализация архитектуры JavaTM для привязки XML (JAXB), (сборка JAXB 2.1.10 в JDK 6)

1 голос
/ 21 июня 2010

Я не смог найти и ответить на это в официальном документе, но, поиграв с ним и прочитав «Web-сервисы Java: запуск и запуск», кажется, что не генерирует потоки для каждого соединения. Таким образом, сервис блокируется до тех пор, пока не будет выполнен один запрос, а затем обрабатывается новый запрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...