У меня проблема с моим веб-сервисом 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(), и новый запрос был принят без выхода из предыдущего (для отладки использовались простые протоколирующие заявления).
Итак ... Что блокирует второй запрос? Я действительно не понимаю, или я пропустил что-то нелепое?
Заранее благодарен!
Сделайте TestBean '@ RequestScoped'. Только один поток может одновременно обращаться к экземпляру EJB. –
TestBean является аннотацией '@ Stateless', поэтому контейнер будет создавать новый экземпляр для каждого запроса (если мы игнорируем размер пула и повторное использование)? Поэтому каждый поток имеет свой собственный экземпляр ... исправьте меня, если я ошибаюсь. – 2ChRisPY5
Нет причин думать, что это произойдет; Я считаю, что по умолчанию это @Dependent, и вы вставляете его в JAX-RS-службу, которая эффективно является singleton. –