使用Spring的RestTemplate并设置超时时间,如何检测超时?

30

我已按以下方式初始化了我的restTemplate:

HttpClient httpClient = HttpClientBuilder.create().build();
HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(httpClient);
requestFactory.setConnectTimeout(1000);
requestFactory.setReadTimeout(1000);
restTemplate = new RestTemplate(requestFactory);

我这样调用它:

restTemplate.getForEntity(someString, String.class, SomeHashmapWithURLParameters)

我该如何处理两个超时(timeout)?我假设会抛出异常(exception)?如果是这样的话,我应该捕获(catch)哪个具体异常来专门处理超时(timeout)。我会以不同的方式处理其他异常。

1个回答

60

RestTemplate中,当请求超时时,Spring将抛出ResourceAccessException异常。该实例下的根本异常将是带有消息“读取超时”的java.net.SocketTimeoutException


8
如果出现套接字超时或连接超时,就会抛出ResourceAccessException异常,因此您需要检查ex.getCause是否为套接字超时异常类型。我已经通过以下if语句解决了这个问题:如果(ex instanceof InterruptedException || (ex instanceof ResourceAccessException && ex.getCause() instanceof SocketTimeoutException)) { - amir bayan
@amirbayan 有没有官方的Spring文档明确说明RestTemplate会抛出带有底层STE的RAE?不幸的是,答案中的javadoc并没有这样做,我需要一些官方文档。 - Daniel Pop
@amirbayan 为什么你把 InterruptedException 当作超时异常来处理? - Simon Logic
由于在超时的情况下,线程将被中断并抛出异常。从“中断异常”的描述中可以看出:当线程正在等待、睡眠或其他操作时,如果线程在活动期间或之前被中断,则会抛出此异常。 - amir bayan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接