Почему мой 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 больше не блокируется, и все работает как положено. Оглядываясь назад, я чувствую себя немного глупо, спрашивая об этом. Но эй... может быть, это поможет другим:)

Другие вопросы по тегам