RestTemplate 的 post/get 请求,造成 程序停顿 2小时
RestTemplate 的 post/get 请求,造成 程序停顿 2h
异常的现象:
执行到 上面代码的 第5行后,不再往下继续执行,会停顿 2h 甚至更久(时长与 restTemplate 是否有资源有关)。由于这是后端服务处理程序,不存在超时问题,所以会长时间 停顿,处在假死状态。
如果是接受前端请求的接口,会造成大量请求超时无响应。
启动类:
@SpringBootApplication(scanBasePackages = { "com.wqb.platform"}) @EnableSwagger2 @EnableDiscoveryClient @EnableFeignClients(basePackages = {"com.wqb.platform"}) @ComponentScan(basePackages = {"com.wqb.platform"}, excludeFilters = { @ComponentScan.Filter(type = FilterType.REGEX, pattern = "com.other.common.*"), @ComponentScan.Filter(type = FilterType.REGEX, pattern = "com.second.config.*") }) @EnableAsync @EnableRetry public class PlatFormApplication { public static void main(String[] args) { SpringApplication.run(PlatFormApplication.class,args); } @Bean @LoadBalanced public RestTemplate restTemplate(){ return new RestTemplate(); } }
请求发起类:
1 RestTemplate restTemplate = new RestTemplate(); 2 HttpHeaders requestHeaders = new HttpHeaders(); 3 requestHeaders.setContentType(MediaType.APPLICATION_JSON); 4 HttpEntity<Map<String, Object>> requestEntity = new HttpEntity<>(requestBody, requestHeaders); 5 String jsonStr = restTemplate.postForObject(url, requestEntity, String.class); 6 system.out.print("请求结果:" + jsonStr);
处理方式是:
将 ‘请求发起类’的第1行 RestTemplate restTemplate = new RestTemplate();
实例的创建,交给 spring 来管理和维护, 使用 注入的方式:
@Autowired private RestTemplate restTemplate;
请求发起类:调整为
1 // RestTemplate restTemplate = new RestTemplate(); 2 HttpHeaders requestHeaders = new HttpHeaders(); 3 requestHeaders.setContentType(MediaType.APPLICATION_JSON); 4 HttpEntity<Map<String, Object>> requestEntity = new HttpEntity<>(requestBody, requestHeaders); 5 String jsonStr = restTemplate.postForObject(url, requestEntity, String.class); 6 system.out.print("请求结果:" + jsonStr);