2017-01-26 6 views
0

У меня проблема с моим веб-сервисом REST. Я хочу запустить асинхронно. Пример показывает, что я хочу делать. Основная проблема заключается в том, что веб-служба не принимает новый запрос до завершения работы старого. Я использую Wildfly 10 в качестве моего сервера приложений и его реализации RESTeasy.Асинхронный веб-сервис REST

WebApplication.java

@ApplicationPath("rest") 
public class WebApplication extends Application 
{ 
    public WebApplication() 
    { 
     super(); 
    } 
} 

TestService.java

@Path("test") 
public class TestService 
{ 
    @Inject 
    private TestBean bean; 

    @GET 
    @Produces(MediaType.APPLICATION_JSON) 
    public void getDateTime(@Suspended final AsyncResponse response) 
    { 
     CompletableFuture.supplyAsync(() -> response.resume(bean.getResult())) 
       .exceptionally((ex) -> (response.resume(ex))); 
    } 
} 

TestBean.java

@Stateless 
public class TestBean 
{ 
    public TestTO getResult() 
    { 
     Logger.getLogger(Thread.currentThread().getName()).log(Level.INFO, "Entering REST service"); 

     for (long l = 0; l < Long.MAX_VALUE; l++) 
     { 
      // just for simulating a veeeery heavy operation 
     } 
     return new TestTO(); 
    } 
} 

TestTO - это просто ПОЖО, поэтому ничего особенного там нет. Я не могу представить, что случилось. Я искал в google, чтобы посмотреть на разные подходы, но ничего не получилось. Что-то я пробовал тоже для тестирования:

Я поставил петлю после вызова response.resume(), и новый запрос был принят без выхода из предыдущего (для отладки использовались простые протоколирующие заявления).

Итак ... Что блокирует второй запрос? Я действительно не понимаю, или я пропустил что-то нелепое?

Заранее благодарен!

+0

Сделайте TestBean '@ RequestScoped'. Только один поток может одновременно обращаться к экземпляру EJB. –

+0

TestBean является аннотацией '@ Stateless', поэтому контейнер будет создавать новый экземпляр для каждого запроса (если мы игнорируем размер пула и повторное использование)? Поэтому каждый поток имеет свой собственный экземпляр ... исправьте меня, если я ошибаюсь. – 2ChRisPY5

+0

Нет причин думать, что это произойдет; Я считаю, что по умолчанию это @Dependent, и вы вставляете его в JAX-RS-службу, которая эффективно является singleton. –

ответ

0

Хорошо, я понял.

Я не писал клиентское приложение, которое выполняет запросы одновременно, вместо этого я использовал Firefox, чтобы быстро увидеть результат. Я открыл 2 вкладки и назвал URL-адрес веб-службы. Позже я сделал то же самое с Microsoft Edge и ... его работой! Exmaple работает на 100%.

Я не знаю, почему ... может быть, потому что Edge порождает совершенно новый процесс за вкладку и Firefoy не делает? Ничего, в следующий раз я использую SoupUI для тестирования веб-сервисов.

Прошу прощения за глупый вопрос. Если бы я работал правильно, я видел проблему.