Der Anwendungscode ist wie folgt strukturiert:
Code: Select all
// 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();
}
Wenn ich eine Anfrage von einem ReactJS-Client an den Endpunkt mit langer Laufzeit initiiere (
Code: Select all
.../{deviceId}/testWährend die erste Anfrage jedoch noch verarbeitet wird, sende ich sofort eine zweite Anfrage an den Schnellendpunkt (
Code: Select all
.../{deviceId}/test-otherDie Protokolle zeigen an, dass der derselbe Thread (und deshalb vermute ich, derselbe Thread) beide Anfragen nacheinander für eine bestimmte Geräte-ID verarbeitet:
Meine Frage
- Warum wird die zweite Anfrage von der ersten blockiert?
- Welcher Mechanismus in RESTEasy Reactive/Quarkus verursacht die Serialisierung von Anforderungen für diese Ressource oder dieses Gerät?
- Wie kann ich diese Ressource/diese Endpunkte so konfigurieren, dass die zweite, schnelle Anforderung sofort ausgeführt werden kann, ohne auf den Abschluss der ersten warten zu müssen?
- Ich habe versucht, die Annotation @Blocking zu entfernen (die keine Auswirkung hatte) und habe sichergestellt, dass beide verwendet werden @RunOnVirtualThread. Welche spezifische Anmerkung oder Konfiguration ist erforderlich, um dieses endpunktübergreifende Blockierungsverhalten zu verhindern?
Mobile version