使用sping的restTemplate超时,如何检测超时?

lin*_*dan 19 java timeout connection-timeout resttemplate spring-boot

我已经初始化了我的restTemplate,如下所示:

HttpClient httpClient = HttpClientBuilder.create().build();
HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(httpClient);
requestFactory.setConnectTimeout(1000);
requestFactory.setReadTimeout(1000);
restTemplate = new RestTemplate(requestFactory);
Run Code Online (Sandbox Code Playgroud)

而我这样称呼它:

restTemplate.getForEntity(someString, String.class, SomeHashmapWithURLParameters)
Run Code Online (Sandbox Code Playgroud)

我如何处理这两个超时?我假设会抛出一个异常?如果是这样,我可以捕获哪个特定的异常,以便专门处理只是超时.我以不同的方式处理其他异常.

Dar*_*hta 33

如果RestTemplate请求超时,Spring将抛出ResourceAccessException.该实例下的基础异常将显示java.net.SocketTimeoutException消息"Read timed out".

  • Socket超时或连接超时时会抛出ResourceAccessException,因此需要检查ex.getCause是否是socket超时异常类型。我通过以下 if 语句解决了这个问题: if (ex instanceof InterruptedException || (ex instanceof ResourceAccessException && ex.getCause() instanceof SocketTimeoutException)) { (8认同)