2016-08-08 2 views
0

Я пытаюсь создать асинхронный веб-сайт Джерси RESTful.Джерси асинхронный многопоточный ответ?

Следующий код используется для проверки реализации, но он не работает.

@Path("/demox") 
public class RESTClient { 

    public static boolean ran = false; 

    @GET 
    @Path("/test") 
    @ManagedAsync 
    public void test(@Suspended final AsyncResponse asyncResponse) throws InterruptedException { 
     asyncResponse.setTimeout(10000, TimeUnit.MILLISECONDS); 
     asyncResponse.setTimeoutHandler(ar -> ar.resume(
       Response.status(Response.Status.SERVICE_UNAVAILABLE) 
         .entity("Operation timed out") 
         .build())); 
     if(!ran) { 
      while(true) { 
       ran = true; 
      } 
     } 
     asyncResponse.resume("REST IS OKAY! "); 
    } 
} 

Как я проверяю это, я дважды открываю URL-адрес. Но вторая вкладка всегда ждет первого таймаута. Так что это явно не работает.

Servlet файла:

<servlet> 
    <servlet-name>Jersey REST Service</servlet-name> 
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> 
    <init-param> 
     <param-name>jersey.config.server.provider.packages</param-name> 
     <param-value>services,org.codehaus.jackson.jaxrs</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
    <async-supported>true</async-supported> 
</servlet> 
<servlet-mapping> 
    <servlet-name>Jersey REST Service</servlet-name> 
    <url-pattern>/rest/*</url-pattern> 
</servlet-mapping> 

ответ

0

Я думаю, что это работает. В соответствии с here:

По параметру AsyncResponse в методу ресурса мы говорим средам выполнению Джерси, что метод, как предполагается, будет вызван с использованием режима асинхронной обработки, то есть соединение клиента не должно быть автоматически закрыто лежащим в основе Контейнер ввода-вывода, когда метод возвращается. Вместо этого инъецируемый экземпляр AsyncResponse (который представляет собой приостановленное соединение с запросом клиента) будет использоваться для явной отправки ответа клиенту с использованием другого потока. Другими словами, время выполнения в Джерси знает, что, когда метод asyncGet завершается, ответ на клиента может быть еще не готов, и обработка должна быть приостановлена ​​и ждать, пока она будет явно возобновлена ​​с ответом, как только она станет доступной.

+0

Да. Но как бы вы объяснили время ожидания, необходимое для загрузки второй вкладки браузера? Все вкладки, которые открываются после первого, ждут завершения загрузки, а затем загружаются мгновенно. –

+0

указанная ссылка в настоящее время отключена, ее можно найти по адресу: https://jersey.github.io/documentation/latest/async.html – anand

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

  • Нет связанных вопросов^_^