Код приложения структурирован следующим образом:
Код: Выделить всё
// Endpoint 1: Simulates a long-running, blocking task
@POST
@Path("/{deviceId}/test")
@RunOnVirtualThread
@Blocking
public RestResponse testDevice(String deviceId) throws InterruptedException {
// deviceId is a placeholder for the path parameter or header injection
log.info("Testing digital signage device: {}", deviceId);
Thread.sleep(20_000); // 20-second simulated block
return RestResponse.noContent();
}
// Endpoint 2: A quick, non-blocking task
@POST
@Path("/{deviceId}/test-other")
public RestResponse testOtherDevice(String deviceId) throws InterruptedException {
log.info("Request received for quick operation.");
// This method returns almost immediately
return RestResponse.noContent();
}
Когда я инициирую запрос от клиента ReactJS к долгоработающей конечной точке (
Код: Выделить всё
.../{deviceId}/testОднако, пока первый запрос все еще обрабатывается, если я немедленно отправлю второй запрос в быструю конечную точку (
Код: Выделить всё
.../{deviceId}/test-otherЖурналы показывают, что один и тот же поток (и, следовательно, я подозреваю, один и тот же поток) последовательно обрабатывает оба запроса для данного идентификатора устройства:
Мой вопрос
- Почему второй запрос блокируется первым?
- Какой механизм в RESTEasy Reactive/Quarkus вызывает сериализацию запросов к этому ресурсу или устройству?
- Как настроить этот ресурс/конечные точки, чтобы второй быстрый запрос выполнялся немедленно, не дожидаясь завершения первого?
- Я пробовал удалить аннотацию @Blocking (которая никакого эффекта) и убедиться, что оба используют @RunOnVirtualThread. Какая конкретная аннотация или конфигурация необходима для предотвращения такого поведения блокировки между конечными точками?
Подробнее здесь: https://stackoverflow.com/questions/798 ... e-resource
Мобильная версия