Код приложения структурирован следующим образом:
Код: Выделить всё
String deviceId; // Assumed to be injected via a filter or standard mechanism
// Endpoint 1: Simulates a long-running, blocking task
@POST
@Path("/{deviceId}/test")
@RunOnVirtualThread
@Blocking
public RestResponse testDevice() 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() 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 вызывает сериализацию запросов к этому ресурсу или устройству?
- Как настроить этот ресурс/конечные точки, чтобы второй быстрый запрос выполнялся немедленно, не дожидаясь завершения первого?
Подробнее здесь: https://stackoverflow.com/questions/798 ... nts-on-the
Мобильная версия