测试connectTimeout的方法
方法:链接一个不可到达的IP地址
例如10.255.255.1,以下用restTemplate为例:
public void testRestTemplate() {
log.info("开始");
ResponseEntity<JsonResult> exchange = restTemplate.exchange("http://10.255.255.1/acv", HttpMethod.POST, new HttpEntity<>(null, null), JsonResult.class);
log.info("结束");
}
返回:
注:这里我尝试过设置更长的连接超时,貌似最长只能是20s,设置1分钟也是20s后就报连接超时
测试ReadTimeout
方法:在服务提供者一方,设置一定的sleep时间,如下:
public TestHttpAccessResponse testHttpAccess(TestHttpAccessRequest request) {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return BeanUtil.toBean(request, TestHttpAccessResponse.class);
}
以下以RestTemplate为例,在服务消费者一方,设置eadTimeout时间为4s,这样就可以触发ReadTimeoutException
@Bean
public RestTemplate restTemplate() {
return new RestTemplateBuilder()
//连接超时
.setConnectTimeout(Duration.ofMinutes(1))
//读取超时,可理解为soTimeout
.setReadTimeout(Duration.ofSeconds(4))
.build();
}
在消费者一方使用RestTempalte调用服务后,我这里调用一下封装【具体请看:通过SpringBoot-RestTemplate进行请求】
@SneakyThrows
public TestHttpAccessResponse sendHttpRequestByRestTemplate() {
TestHttpAccessRequest request = new TestHttpAccessRequest();
request.setAge(16);
request.setName("刘伞");
request.setAddress("佛山市");
//设置为5000超时的接口
String httpUrl = "http://localhost:8082/nacos-service-provider/testHttpAccess";
JsonResult jsonResult = restTemplateTestService.doExchange(httpUrl, request, JsonResult.class);
if (Objects.isNull(jsonResult) || !ReturnCode.SUCCESS.getCode().equals(jsonResult.getCode())) {
if (Objects.isNull(jsonResult)) {
throw new BizException(ReturnCode.ERROR);
} else {
throw new BizException(jsonResult.getCode(), jsonResult.getMessage());
}
}
TestHttpAccessResponse response = objectMapper.convertValue(jsonResult.getData(), TestHttpAccessResponse.class);
return response;
}
结果: