Wie benutze ich CompletenableFuture mit ORTimeOut und erhalten Sie Controller -Handler -Antworten?

Post a reply

Smilies
:) :( :oops: :chelo: :roll: :wink: :muza: :sorry: :angel: :read: *x) :clever:
View more smilies

BBCode is ON
[img] is ON
[flash] is OFF
[url] is ON
Smilies are ON

Topic review
   

Expand view Topic review: Wie benutze ich CompletenableFuture mit ORTimeOut und erhalten Sie Controller -Handler -Antworten?

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.>

Top