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