2015-05-02 2 views
2

я анализирую некоторый джерси код 2.0 и у меня есть вопрос о том, как работает следующий метод:jersey ws 2.0 @suspended AsyncResponse, что он делает?

@Stateless 
    @Path("/mycoolstuff") 
    public class MyEjbResource { 
    … 
    @GET 
    @Asynchronous //does this mean the method executes on child thread ? 
    public void longRunningOperation(@Suspended AsyncResponse ar) { 
     final String result = executeLongRunningOperation(); 
     ar.resume(result); 
    } 

    private String executeLongRunningOperation() { … } 
    } 

позволяет сказать, что IM в веб-браузере и я ввести в www.mysite/mycoolstuff это запустит метод но я не понимаю, что используется asyncResponse для @Asynchronous annotation. Из браузера, как бы я заметил его asychnronous? Какая разница в удалении аннотации? Также приостановленная аннотация после прочтения documentation я не совсем понимаю ее цель.

- это @Asynchronous аннотация, просто говорящая программе выполнить этот метод в новом потоке? это удобный способ для создания «новой темы (.....)»?

Обновление: эта аннотация избавляет сервер от зависания на потоке обработки запроса. Пропускная способность может быть лучше. Во всяком случае с официальным docs:

обработка запроса на сервере работает по умолчанию в режиме синхронной обработки, что означает, что клиент соединение запроса обрабатывается в одном вводе/выводе контейнера нити. После обработки потока запрос возвращается в контейнер ввода-вывода, контейнер может с уверенностью предположить, что обработка запроса завершена и что клиентское соединение можно безопасно освободить, включая все ресурсы, связанные с соединением. Эта модель обычно достаточна для обработки запросов, для которых выполнение метода ресурса обработки занимает относительно короткое время. Однако в тех случаях, когда известно, что выполнение метода ресурса занимает много времени для вычисления результата, следует использовать модель асинхронной обработки на стороне сервера. В этой модели связь между потоком обработки запроса и соединением клиента нарушена. Контейнер ввода-вывода, который обрабатывает входящий запрос, может больше не предполагать, что клиентское соединение может быть безопасно закрыто при возврате потока обработки запроса. Вместо этого необходимо открыть средство для явного приостановки, возобновления и закрытия клиентских подключений. Обратите внимание, что использование серверной модели асинхронной обработки не улучшит время обработки запроса, воспринимаемое клиентом. Тем не менее, он увеличит пропускную способность сервера, высвободив начальный поток обработки запроса обратно в контейнер ввода-вывода, в то время как запрос все еще может ждать в очереди для обработки или обработка может все еще работать в другом выделенном потоке. Выпущенный поток контейнера ввода-вывода может использоваться для приема и обработки новых входящих запросов.

+0

желание у кого-то ответ на этот вопрос, у меня есть тот же вопрос – greyfox

ответ

0

@Suspended более определенно, если вы использовали его, иначе это не имеет никакого отношения к использованию it.let's talk о преимуществах его.

  • @Suspended приостанавливает/приостанавливает текущий поток, пока не получит ответ, по умолчанию #NO_TIMEOUT не установлен тайм-аут приостановки. так что это не означает, что ваш поток ответов будет бесплатным и доступен для других.
  • Теперь Предположим, что вы хотите, чтобы ваш сервис был ответом с определенным временем, но метод, который вы вызываете с ресурса, не гарантирует время отклика, тогда как вы будете управлять временем ответа службы. В это время вы можете установить тайм-аут приостановки для вашего обслуживания, используя @Suspended, и даже обеспечить ответную реакцию при возврате времени.

Ниже приведен пример кода для установки приостановки/паузы ожидания

public void longRunningOperation(@Suspended AsyncResponse ar) { 
*  ar.setTimeoutHandler(customHandler); 
*  ar.setTimeout(10, TimeUnit.SECONDS); 
*  final String result = executeLongRunningOperation(); 
*  ar.resume(result); 
* } 

for more details refer this

0

Аннотации @suspend заставляют вызывающего абонента дождаться завершения вашей работы. Допустим, у вас много работы, чтобы сделать еще один поток. когда вы используете jersey @suspend, вызывающий абонент просто сидит там и ждет (так что в веб-браузере они просто видят счетчик), пока ваш объект AsyncResponse не вернет ему данные.

Изображение У вас была очень длинная операция, которую вы должны были сделать, и вы хотите сделать это в другом потоке (или нескольких потоках). Теперь мы можем заставить пользователя подождать, пока мы не закончим. Не забывайте, что в трикотаже вам нужно добавить «истинное» право в определении сервлета джерси в web.xml, чтобы заставить его работать.

+0

Пожалуйста, поправьте меня, если я неправильно. В состоянии покоя, поскольку состояние клиента неизвестно серверу, и каждый запрос является новым запросом и independednt из любого предыдущего запроса, тогда зачем нам нужен AsyncResponse? Поскольку для каждого запроса у нас есть другой поток, и каждый поток может самостоятельно выполнить метод longRunningOperation, не дожидаясь завершения других потоков. – bluelurker

+0

Я обновил свой ответ. – j2emanue

Смежные вопросы