RestTemplateで呼び出した外部APIでConnectTimeout/ReadTimeoutが発生した場合のハンドリングを追加する。ConnectTimeout/ReadTimeout共にResourceAccessExceptionクラスとしてハンドリングできる。
@RestControllerAdvice
class GlobalExceptionHandler {
@ExceptionHandler(ResourceAccessException::class)
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
fun handleHttpServerErrorException(e: ResourceAccessException): String {
return "Internal Server Error"
}
}
確認
意図的にReadTimeout/意図的にConnectTimeoutを発生させて、POSTMANでリクエストを実行。
HttpStatusが500(Internal Server Error)、レスポンスボディが指定した”Internal Server Error”になっている事を確認。
SpringBootが出力するWARNログを確認
ReadTimeout
2021-01-03 17:07:26.675 WARN 10701 --- [nio-8080-exec-1] .m.m.a.ExceptionHandlerExceptionResolver : Resolved [org.springframework.web.client.ResourceAccessException: I/O error on GET request for "http://localhost:50000/tasks/12345": Read timed out; nested exception is java.net.SocketTimeoutException: Read timed out]
ConnectTimeout
2021-01-03 17:12:12.866 WARN 10738 --- [nio-8080-exec-2] .m.m.a.ExceptionHandlerExceptionResolver : Resolved [org.springframework.web.client.ResourceAccessException: I/O error on GET request for "http://127.0.0.2/tasks/12345": Connect to 127.0.0.2:80 [/127.0.0.2] failed: Connect timed out; nested exception is org.apache.http.conn.ConnectTimeoutException: Connect to 127.0.0.2:80 [/127.0.0.2] failed: Connect timed out]
コード
https://github.com/little-engineer/bff-sample/pull/31/files
コメントを残す