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);
