2016-06-10 6 views
0

ich einen Web-Service läuft Undertow eingebettet haben, und einige der Handler Verwendung des gemeinsamen Undertow Muster machen von Anfragen an Worker-Threads ausgelagert:Wie behandelt man Exceptions, die von Undertow-Worker-Threads ausgelöst werden?

if (exchange.isInIoThread()) { 
    exchange.dispatch(this); 
} 

Dies ist für die Leistung, aber es stellt ein Problem im Umgang mit Fehlerbehandlung. Ich habe einen benutzerdefinierten ErrorHandler erstellt, der Java-Ausnahmen den HTTP-Antworttypen und Protokollierungsstufen zuordnet und den API-Handlern selbst erlaubt, Ausnahmen auszugeben und sich nicht darum zu kümmern, sie zu behandeln. Leider werden Anfragen, die an einen Worker-Thread gesendet werden, nie in den ErrorHandler aufgenommen, was immer zu einem Fehler von 500 führt, wenn sie eine Ausnahme auslösen. Gibt es eine Möglichkeit, Ausnahmen von Arbeitsthreads abzufangen, oder muss ich die Ausnahmebehandlung in jedem API-Handler implementieren?

+0

Sie können 'UncaughtExceptionHandler' pro Thread festlegen, um die durch Threads ausgelöste Ausnahme zu behandeln – Saravana

+0

Der Handler benötigt Zugriff auf den HttpServerExchange für die fehlgeschlagene Anforderung. Es wäre möglich, das zu übergeben, wenn ich den Code für alle Handler kontrolliere, aber es gibt viele eingebaute Handler, die verwendet werden, wie https://github.com/undertowio/undertow/blob/ master/core/src/main/java/io/undertow/security/handlers/AuthenticationCallHandler.java # L46. – Jared

Antwort

1

Ich habe einen Handler in der Kette hinzugefügt, der die Anfrage sofort an einen Worker-Thread sendet. Dann fügte ich meine Fehlerbehandlungslogik außerhalb der exchange.isInIoThread() Prüfung hinzu, um sicherzustellen, dass der Fehlerhandler und der Handler, der die Ausnahme ausgelöst hat, immer im selben Thread sind.

Verwandte Themen