by Anonymous » Yesterday, 10:07
Ich verwende Javalin 6.5.0, um eine API zu erstellen und einen Zeitüberschreitungsmechanismus für alle Endpunkte implementieren zu können.
Code: Select all
post("/balance", balanceController::getBalance, Role.AUTHORIZED);
< /code>
Ich möchte so etwas erreichen: < /p>
post("/session", ctx -> withTimeout(sessionController::createSession).accept(ctx), Role.AUTHORIZED);
get("/status", ctx -> withTimeout(healthController::getHealth).accept(ctx), Role.AUTHORIZED);
< /code>
Wo with timeout aus dieser Form ist: < /p>
private Consumer withTimeout(Handler handler) {
return context -> {
context.future(() -> CompletableFuture.supplyAsync(() -> {
try {
handler.handle(context);
} catch (Exception e) {
throw new RuntimeException(e);
}
return null;
}).orTimeout(200, TimeUnit.MILLISECONDS)
.exceptionally(throwable -> {
if (throwable instanceof TimeoutException) {
context.status(408).result("timed out");
}
//otherwise preserve the status and error messages modified inside the handler
return throwable;
}));
};
}
Problem
Während das Zeitübergang wie erwartet funktioniert, erhalte ich in allen anderen Fällen falsche Statuscodes. Anforderungen an/status Gibt 200 OK falsch zurück, wenn es 500 für den Moment zurücksenden sollte.
Was mache ich hier falsch? Ist es tatsächlich möglich, was ich erreichen möchte?
Ich bin offen für eine andere Implementierung, die funktioniert.>
Ich verwende Javalin 6.5.0, um eine API zu erstellen und einen Zeitüberschreitungsmechanismus für alle Endpunkte implementieren zu können.[code]post("/balance", balanceController::getBalance, Role.AUTHORIZED);
< /code>
Ich möchte so etwas erreichen: < /p>
post("/session", ctx -> withTimeout(sessionController::createSession).accept(ctx), Role.AUTHORIZED);
get("/status", ctx -> withTimeout(healthController::getHealth).accept(ctx), Role.AUTHORIZED);
< /code>
Wo with timeout aus dieser Form ist: < /p>
private Consumer withTimeout(Handler handler) {
return context -> {
context.future(() -> CompletableFuture.supplyAsync(() -> {
try {
handler.handle(context);
} catch (Exception e) {
throw new RuntimeException(e);
}
return null;
}).orTimeout(200, TimeUnit.MILLISECONDS)
.exceptionally(throwable -> {
if (throwable instanceof TimeoutException) {
context.status(408).result("timed out");
}
//otherwise preserve the status and error messages modified inside the handler
return throwable;
}));
};
}
[/code]
[b] [url=viewtopic.php?t=18916]Problem[/url] [/b]
Während das Zeitübergang wie erwartet funktioniert, erhalte ich in allen anderen Fällen falsche Statuscodes. Anforderungen an/status Gibt 200 OK falsch zurück, wenn es 500 für den Moment zurücksenden sollte.
Was mache ich hier falsch? Ist es tatsächlich möglich, was ich erreichen möchte?
Ich bin offen für eine andere Implementierung, die funktioniert.>