Возможны ли асинхронные веб-сервисы RESTful? - PullRequest
17 голосов
/ 28 сентября 2011

Чтение RESTful документации, не похоже, что возможно реализовать асинхронный экземпляр, но кто-то может знать лучше о SO.

Я имею в виду, что я хотел бывыполнять запросы на обслуживание асинхронно:

@Path("/helloworld", asyncSupported=true)
public class MyHelloWorldService {
    ...
}

Я знаю, asyncSupported не определено в @Path, но я ищу что-то похожее на @WebServlet.Затем я хотел бы использовать AsyncContext экземпляры (или что-нибудь эквивалентное).

Возможно ли это?

Ответы [ 6 ]

8 голосов
/ 03 октября 2011

RestEasy имеет некоторую поддержку 1 для него - с помощью пользовательской аннотации под названием @Suspend.

Смотрите здесь: http://docs.jboss.org/resteasy/docs/2.2.1.GA/userguide/html/Asynchronous_HTTP_Request_Processing.html

Существует также фреймворк / библиотека поверх Джерси, который называется Atmosphere, однако он может оказаться излишним для вашего сценария использования, поскольку он, как представляется, фокусируется на клиентских / серверных веб-приложениях с длительным опросом (например, чаты - https://github.com/Atmosphere/atmosphere)

[1] Область действия CDI для вашего запроса будет потеряна в потоке, который фактически выполняет логику. См. Проблему RESTEasy-682 для получения дополнительной информации. Это проблема, которая не была решена ни одной средой REST, о которой я знаю в данный момент [март 2014] .

2 голосов
/ 19 июля 2013

Теперь вы можете выполнять асинхронные вызовы RESTful, используя API JAX-RS 2.0, который является частью недавно выпущенной Java EE 7.0

http://www.slideshare.net/reza_rahman/jaxrs2?ref=

2 голосов
/ 03 октября 2011

Спокойная спесификация еще в раннем возрасте. Но эту проблему следует рассматривать как 2 часть. Клиент и Сервер.

Клиент:

Для клиентской стороны последние изменения в прошлом году стали достаточно зрелыми. А недавно был внедрен неблокирующий клиент на основе Жанфрансуа Аркана и перенесен в хранилище. Здесь есть объяснение .

Сервер:

Что касается сервера, то он еще незрелый. Принятие новой спецификации сервлета происходит довольно медленно, и как разработчик я ожидаю, что JSR 339 также решит эти проблемы. И это также учтено в спецификации JSR с этими предложениями.

JAX-RS 1.1 определяет модель ответа синхронного запроса на сервере боковая сторона. Этот JSR определит простую асинхронную обработку запроса модель так, что ответ может быть возвращен асинхронно к запрос. Servlet 3.0 может быть использован для включения такой поддержки, но Реализации могут выбрать использование других API для конкретного контейнера вместо этого.

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

2 голосов
/ 30 сентября 2011

По-видимому, это возможно с CXF и Jetty Continuations , но это возможно только с Jetty 6; они были изменены в Jetty 7 на что-то, что входит в спецификацию Servlet 3.0, и я не знаю, поддерживается ли это CXF. Более того, Jetty Continuations выглядит как грязный API, с большим количеством ручного материала , поэтому я не знаю, насколько просто конвертировать код.

Тем не менее, несколько возможно, кажется. С последующим ветерком и когда Бог пожелает этого.

1 голос
/ 02 августа 2012

Проверьте Pubsubhubbub, найденный здесь , для примера асинхронного протокола на основе REST.Он основан на формате синдикации Atom и намного проще, чем механизмы WS- * pub / sub.

0 голосов
/ 08 ноября 2017

Вы также можете попробовать Spring Webflux , который является асинхронным и реактивным одновременно. Однако это не реализация JAX-RS в Java EE.

...