Возможны ли асинхронные веб-службы RESTful?
Чтение RESTful, похоже, что невозможно реализовать асинхронный экземпляр, но кто-то может лучше узнать о SO.
Что я имею в виду здесь, я хотел бы выполнить асинхронные запросы службы:
@Path("/helloworld", asyncSupported=true)
public class MyHelloWorldService {
...
}
Я знаю, что asyncSupported
не определен в @Path
, но я ищу что-то похожее на @WebServlet
. Затем я хотел бы использовать экземпляры AsyncContext
(или что-то подобное).
Возможно ли это?
Ответы
Ответ 1
RestEasy имеет некоторую поддержку 1 для него - используя пользовательскую аннотацию под названием @Suspend
.
Смотрите здесь:
http://docs.jboss.org/resteasy/docs/2.2.1.GA/userguide/html/Asynchronous_HTTP_Request_Processing.html
Существует также фреймворк/библиотека поверх Джерси, называемая Atmosphere, однако это может быть излишним для вашего usecase, поскольку его фокус, как представляется, заключается в длительном опросе клиент-серверных веб-приложений (например, чаты - https://github.com/Atmosphere/atmosphere)
[1] Область CDI для вашего запроса будет потеряна в потоке, который фактически выполняет логику. См. RESTEasy-682 для получения дополнительной информации. Это проблема, которая не была решена никакими структурами REST, которые я знаю в данный момент [March 2014].
Ответ 2
По-видимому, возможно с CXF и Jetty Continuations, но это возможно только с Jetty 6; они были изменены в Jetty 7 на то, что в спецификации Servlet 3.0, и я не знаю, поддерживает ли это CXF. Более того, Jetty Continuations, по-видимому, немного беспорядочный API с большим количеством ручного материала, поэтому я не знаю, как легко конвертировать код.
Тем не менее, кажется несколько возможным. Со следующего ветра и когда Бог захочет.
Ответ 3
Относящаяся помощь по-прежнему находится в раннем возрасте. Но эту проблему следует рассматривать как 2 часть. Клиент и сервер.
Клиент:
Для клиентской стороны последние изменения в прошлом году стали достаточно зрелыми. И недавно неблокирующий клиент из Jeanfrancois Arcand был реализован и перенесен в репозиторий. Существует описание здесь.
Сервер:
Для серверной части она еще незрелая. Принятие новой спецификации сервлета довольно медленное, и я как разработчик ожидаю JSR 339 для решения этих проблем. И это также четко рассматривается в спецификации JSR с этими предложениями.
JAX-RS 1.1 определяет модель ответа синхронного запроса на сервере боковая сторона. В этом JSR указывается простая обработка асинхронного запроса такой, что ответ может быть возвращен асинхронно запрос. Servlet 3.0 может быть задействован для обеспечения такой поддержки, но реализации могут использовать другие API-интерфейсы, специфичные для конкретного контейнера вместо этого.
Однако есть и другие альтернативы. Такие проекты, как Jetty, рассматривают такие проблемы, как в этом примере. Я могу только предложить вам рассмотреть другие альтернативы, поскольку сообщество растет.
Ответ 4
Теперь вы можете создавать вызовы Asynchoronous RESTful с использованием JAX-RS 2.0 API, который является частью недавно выпущенного Java EE 7.0
http://www.slideshare.net/reza_rahman/jaxrs2?ref=
Ответ 5
Отъезд Pubsubhubbub нашел здесь для примера асинхронного протокола на основе REST. Он основан на формате Atom Syndication и намного проще, чем WS- * pub/sub механизмы.
Ответ 6
Вы также можете попробовать Spring Webflux, который одновременно является асинхронным и реактивным. Однако это не реализация JAX-RS из Java EE.