2013-03-08 3 views
1

Я нахожусь в SAP NetWeaver 7.3 EHP 1 (сертифицирован JEE5), и я создал скелет веб-службы для существующего WSDL. Все методы в этом веб-сервисе не блокируются и поэтому аннотируются с помощью @Oneway. Сама услуга работает отлично.JAX-WS - внедрить WebServiceContext в @WebService, который имеет только методы @Oneway

Мне также нужно получить доступ к инъекционному WebServiceContext, и вот где начинается проблема. Я могу вставить контекст просто отлично, но каждый вызов для него просто заканчивается в NPE для конкретного сервера или ISE. Я несколько понимаю, что, поскольку неблокирующий вызов выполняется асинхронно с помощью реализации JAX-WS SAP. Однако я попытался проверить это поведение, посмотрев спецификацию JAX-WS. Теперь я либо слепой, либо в спецификации конкретно не говорится, что WebServiceContext не должен использоваться в неблокирующих веб-методах. Фактически, во всей главе 5.3 последней версии спецификации, @Oneway не упоминается один раз. Основное описание

интерфейс javax.xml.ws.WebServiceContext делает возможным для объекта реализации конечных точек и потенциально любых других объектов, которые разделяют его контекст выполнения для доступа к информации, имеющей отношение к запрос обслуживается. Результат вызова любых методов в WebServiceContext компонента вне вызова одного из его методов веб-службы не определен. Реализация СЛЕДУЕТ бросать java.lang- .IllegalStateException, если он обнаруживает такое использование.

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

Вы знаете, что кто-нибудь из вас знает, разрешено ли мне получать доступ к WebServiceContext в неблокируемом веб-методе? Благодаря!

ответ

2

Вы правы: спецификация ничего не говорит об этом ограничении - это только неопределенно подразумевается.

Из спецификации JAX-WS (2.2 Rev A):

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

Должен быть эксплуатационным над существованием конечной точки, но только если они используются в том же потоке, что установка и хранить запрос контекстной информацию в локальной память потока памяти в. Учитывая, что WebServiceContext - это в первую очередь информация MessageContext, которая представляет собой HTTP-запрос/запрос сервлета/WSDL-операции, локальная контекстная информация по потоку, вероятно, должна быть заполнена потоком, который первоначально упорядочивает запрос SOAP/HTTP, что означает, что последующая обработка асинхронного нить не имеет этой информации. Просто основанный на чтении - не тестировал эту комбинацию.