@Configuration public class ScheduleRestConfigurer { @Bean public RestTemplate restTemplate() { RestTemplate restTemplate = new RestTemplate(httpRequestFactory()); FormHttpMessageConverter formConverter = new FormHttpMessageConverter(); restTemplate.getMessageConverters().add(formConverter); restTemplate.getMessageConverters().add(new JacksonConverter()); return restTemplate; } @Bean public ClientHttpRequestFactory httpRequestFactory() { return new HttpComponentsClientHttpRequestFactory(httpClient()); } @Bean public HttpClient httpClient() { //設置協議http和https對應的處理socket鏈接工廠的對象 Registry<ConnectionSocketFactory> registry = RegistryBuilder.<ConnectionSocketFactory>create() .register("http", PlainConnectionSocketFactory.getSocketFactory()) .register("https", sslConnectionSocketFactory()) .build(); PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(registry); int maxTotal = 100; int defaultMaxPerRoute = 20; int validateAfterInactivity = 10000; int socketTimeout = 30000; int connectTimeout = 30000; int connectionRequestTimeout = 30000; connectionManager.setMaxTotal(maxTotal); // 最大連接數 connectionManager.setDefaultMaxPerRoute(defaultMaxPerRoute); //單個路由最大連接數 connectionManager.setValidateAfterInactivity(validateAfterInactivity); // 最大空間時間 RequestConfig requestConfig = RequestConfig.custom() .setSocketTimeout(socketTimeout) //服務器返回數據(response)的時間,超過拋出read timeout .setConnectTimeout(connectTimeout) //連接上服務器(握手成功)的時間,超出拋出connect timeout // .setStaleConnectionCheckEnabled(staleConnectionCheckEnabled) // 提交前檢測是否可用 .setConnectionRequestTimeout(connectionRequestTimeout)//從連接池中獲取連接的超時時間,超時間未拿到可用連接,會拋出org.apache.http.conn.ConnectionPoolTimeoutException: Timeout waiting for connection from pool .build(); return HttpClientBuilder.create() .setDefaultRequestConfig(requestConfig) .setConnectionManager(connectionManager) .setConnectionManagerShared(false) .evictIdleConnections(3000, TimeUnit.MILLISECONDS) //默認重試3次 會從連接池中獲取 不會直接創建新的連接 此處不允許重試 .disableAutomaticRetries() .build(); } @Bean public SSLConnectionSocketFactory sslConnectionSocketFactory() { SSLConnectionSocketFactory sslsf; try { SSLContextBuilder builder = SSLContexts.custom(); builder.loadTrustMaterial(null, new TrustStrategy() { @Override public boolean isTrusted(X509Certificate[] chain, String authType) { return true; } }); SSLContext sslContext = builder.build(); sslsf = new SSLConnectionSocketFactory( sslContext, new X509HostnameVerifier() { @Override public void verify(String host, SSLSocket ssl) throws IOException { } @Override public void verify(String host, X509Certificate cert) throws SSLException { } @Override public void verify(String host, String[] cns, String[] subjectAlts) throws SSLException { } @Override public boolean verify(String s, SSLSession sslSession) { return true; } }); return sslsf; } catch (Exception e) { return null; } } public class JacksonConverter extends MappingJackson2HttpMessageConverter { public JacksonConverter(){ List<MediaType> mediaTypes=new ArrayList<>(); //添加text/html類型的支持 mediaTypes.add(MediaType.TEXT_HTML); //添加text/plain類型的支持.微信接口會用到 mediaTypes.add(MediaType.TEXT_PLAIN); setSupportedMediaTypes(mediaTypes); } } }