Использование wsdl2java для генерации заглушки с поддержкой PROPER async - PullRequest
3 голосов
/ 06 мая 2011

Допустим, у меня есть услуга ТОЛЬКО одним методом: int generateRandomNumbers().

Возможно ли использовать wsdl2java для генерации заглушки с надлежащей поддержкой асинхронности?

Например, сгенерированный класс должен иметь следующие методы / сообщения:

int generateRandomNumbers()
int generateRandomNumbers_Async(callback)

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

Под правильной асинхронной поддержкой я подразумеваю, что

  • generateRandomNumbers_Async не является новым сообщением, поскольку служба понимает только generateRandomNumbers, а не generateRandomNumbers_Async
  • generateRandomNumbers_Async = вызывает generateRandomNumbers в другом потоке и вызывает обратный вызов, когда generateRandomNumbers заканчивается за кадром.

Есть идеи?

Как насчет других платформ веб-сервисов?

Ответы [ 2 ]

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

При использовании CXF он должен работать точно так же, как ваша "вторая" пуля, вроде. Сообщение «generateRandomNumbers» отправляется в вызывающем потоке, поэтому при возникновении ошибки ввода-вывода или аналогичной ситуации, которая будет немедленно возвращена. (согласно спецификации jaxws) Фоновый поток обрабатывает ответ и вызывает обратный вызов.

При создании кода с помощью wsdl2java вам потребуется создать файл привязки jaxws, который будет содержать что-то вроде:

<bindings
  xmlns:xsd="http://www.w3.org/2001/XMLSchema"
  xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
  wsdlLocation="hello_world_async.wsdl"
  xmlns="http://java.sun.com/xml/ns/jaxws">
  <bindings node="wsdl:definitions">
    <enableAsyncMapping>true</enableAsyncMapping>
  </bindings>
</bindings>

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

0 голосов
/ 18 октября 2016

Просто информация для настройки вашего сервера.Аннотация @UseAsyncMethod вызовет асинхронный метод вместо синхронного.Обязательно используйте Servlet 3.0 и более.Сконфигурируйте ваш сервлет, используя true в вашем web.xml:

<servlet>
        <servlet-name>CXFServlet</servlet-name>
        <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
        <!-- Enable asynchronous requests -->
        <async-supported>true</async-supported>
</servlet>
...