Почему мой RestEasy WebService блокируется, когда работает мой @Asynchronous метод?
Я пытаюсь выполнять тяжелые задачи асинхронно. Затем клиент опрашивает сервер, чтобы узнать, когда работа выполнена. Кажется, это сработало, но я заметил, что мой WebService, который отвечает на опрос, блокируется, когда я ставлю точку останова в своем @Asynchronous Method.
Вот что я сделал:
JobWS.java // Используется для начала работы
@RequestScoped
@Path("/job")
@Produces(MediaType.APPLICATION_JSON)
public class JobWS {
@POST
@Path("/run/create")
public Response startJob(MyDTO dto) {
return ResponseUtil.ok(jobService.createJob(dto));
}
}
JobService.java // Создает задание в БД, запускает его и возвращает его идентификатор
@Stateless
public class JobService {
@Inject
private AsyncJobService asyncJobService;
@Inject
private Worker worker;
public AsyncJob createJob(MyDTO dto) {
AsyncJob asyncJob = asyncJobService.create();
worker.doWork(asyncJob.getId(), dto);
return asyncJob; // With this, the client can poll the job with its ID
}
}
Worker.java // Работаем
@Stateless
public class Worker {
@Asynchronous
public void doWork(UUID asyncJobId, MyDTO dto) {
// Do work
// ...
// Eventually update the AsyncJob and mark it as finished
}
}
Наконец, мой веб-сервис Polling, который заблокирован
@RequestScoped
@Path("/polling")
@Produces(MediaType.APPLICATION_JSON)
public class PollingWS {
@Inject
AsyncJobService asyncJobService;
@GET
@Path("/{id}")
public Response loadAsyncJob(@PathParam("id") @NotNull UUID id) {
return ResponseUtil.ok(asyncJobService.loadAsyncJob(id));
}
}
Если я поставлю точку останова где-нибудь в doWork(), PollingWS больше не будет отвечать на запросы HTTP. Когда я отлаживаю с помощью doWork(), иногда я получаю ответ, но только при переходе с одной точки останова на другую, а не при ожидании точки останова.
Что мне здесь не хватает? Почему мой метод doWork () блокирует мой веб-сервис, несмотря на то, что он работает асинхронно?
1 ответ
Я нашел виновника. Точка останова приостанавливает все потоки по умолчанию. В IntelliJ, щелкнув правой кнопкой мыши по нему, откроется следующее диалоговое окно:
При изменении свойства "Suspend" на "Thread" мой WS больше не блокируется, и все работает как положено. Оглядываясь назад, я чувствую себя немного глупо, спрашивая об этом. Но эй... может быть, это поможет другим:)