RestTemplate 设置超时时间

项目访问量大,频繁调取其他系统接口经常出现项目后台假死现象,发现其他系统掉线重启一段时间必现。查看调用接口,同事直接引用了RestTemplate但是没有设置超时时间->_<-。

两种方式:
1.添加 RestTemplateConfig

@Configuration
public class RestTemplateConfig {
    @Bean
    public RestTemplate getRestTemplate() {
        //配置HTTP超时时间
        HttpComponentsClientHttpRequestFactory httpRequestFactory = new HttpComponentsClientHttpRequestFactory();
        httpRequestFactory.setConnectionRequestTimeout(6000);
        httpRequestFactory.setConnectTimeout(6000);
        httpRequestFactory.setReadTimeout(6000);
        return new RestTemplate(httpRequestFactory);
    }
}

  1. 用上面和其他微服务模块有冲突,重写Bean
@Slf4j
public class LocalHttpUtil {
	public static HttpClient httpClient() {
		HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();
		try {
			//设置信任ssl访问
			SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, (arg0, arg1) -> true).build();
			httpClientBuilder.setSSLContext(sslContext);
			HostnameVerifier hostnameVerifier = NoopHostnameVerifier.INSTANCE;
			SSLConnectionSocketFactory sslConnectionSocketFactory = new SSLConnectionSocketFactory(sslContext, hostnameVerifier);
			Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create()
					// 注册http和https请求
					.register("http", PlainConnectionSocketFactory.getSocketFactory())
					.register("https", sslConnectionSocketFactory).build();

			//使用Httpclient连接池的方式配置(推荐),同时支持netty,okHttp以及其他http框架
			PoolingHttpClientConnectionManager poolingHttpClientConnectionManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry);
			// 最大连接数
			poolingHttpClientConnectionManager.setMaxTotal(1000);
			// 同路由并发数
			poolingHttpClientConnectionManager.setDefaultMaxPerRoute(100);
			//配置连接池
			httpClientBuilder.setConnectionManager(poolingHttpClientConnectionManager);
			// 重试次数
			httpClientBuilder.setRetryHandler(new DefaultHttpRequestRetryHandler(0, true));
			//设置默认请求头
			List<Header> headers = new ArrayList<>();
			httpClientBuilder.setDefaultHeaders(headers);
			return httpClientBuilder.build();
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}

	public static ClientHttpRequestFactory clientHttpRequestFactory(int connectTimeOut, int readTimeOut) {
		HttpComponentsClientHttpRequestFactory clientHttpRequestFactory = new HttpComponentsClientHttpRequestFactory(httpClient());
		// 连接超时(毫秒),配置动态设置(秒)
		clientHttpRequestFactory.setConnectTimeout(connectTimeOut * 1000);
		// 数据读取超时时间(毫秒),配置动态设置(秒)
		clientHttpRequestFactory.setReadTimeout(readTimeOut * 1000);
		// 从连接池获取请求连接的超时时间(毫秒),不宜过长,必须设置,比如连接不够用时,时间过长将是灾难性的
		clientHttpRequestFactory.setConnectionRequestTimeout(connectTimeOut * 1000);
		return clientHttpRequestFactory;
	}
}



Service实现类中引用

public RestTemplate restTemplate(){
		//创建RestTemplate的时候,指定ClientHttpRequestFactory
		return new RestTemplate(LocalHttpUtil.clientHttpRequestFactory(mainConfigProperties.getHttpConnectTimeout(),mainConfigProperties.getHttpReadTimeout()));
	}

//调用例子	
String 	restStr = restTemplate.getForObject(url, String.class);

//调用例子 带请求头的请求
		//POST请求——参数拼接类型
		RestTemplate restTemplate = this.restTemplate(); 
		HttpHeaders headers = new HttpHeaders();
		headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
		headers.add("Authorization", Common.BASIC_AUTHORIZATION);
		String rawText = "username="+ username +"&password=" +mainConfigProperties.gePsd();
		HttpEntity<String> formEntity = new HttpEntity<String>(rawText, headers);
		ResponseEntity<String> responseEntity = restTemplate.exchange(url, HttpMethod.POST, formEntity, String.class);


		org.springframework.http.HttpHeaders headers = new org.springframework.http.HttpHeaders();
		ResponseEntity<String> responseEntity = null;
		if(Common.HTTP_METHOD.GET.equals(httpMethod)){
			//GET请求
			headers.add("Authorization", queryInfo.getAuthorization());
			HttpEntity<String> formEntity = new HttpEntity<String>( headers);
			responseEntity = restTemplate.exchange(url, HttpMethod.GET, formEntity, String.class);
		}else{
			//POST请求——参数JSON类型
			HttpEntity<String> formEntity = new HttpEntity<String>(JSON.toJSON(参数实体).toString(),headers);
			headers.setContentType(MediaType.APPLICATION_JSON);
			headers.add("Authorization", queryInfo.getAuthorization());
			responseEntity = restTemplate.exchange(url, HttpMethod.POST, formEntity, String.class);
		}
  • 3
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 设置RestTemplate超时时间的方式有多种,你可以使用ClientHttpRequestFactory、HttpComponentsClientHttpRequestFactory和SimpleClientHttpRequestFactory等方式来设置超时时间。 ### 回答2: RestTemplateSpring框架提供的用于进行HTTP请求的工具类,通过它可以方便地发送各种类型的HTTP请求并获取响应结果。在使用RestTemplate发送HTTP请求时,有时需要设置超时时间来控制请求的最大等待时间,以避免请求因等待时间过长导致的效率低下或系统阻塞。 RestTemplate设置超时时间可以通过以下两种方式进行: 1. HttpComponentsClientHttpRequestFactory方式: ```java // 创建HttpComponentsClientHttpRequestFactory实例 HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(); // 设置连接超时时间(单位:毫秒) factory.setConnectTimeout(5000); // 设置读取超时时间(单位:毫秒) factory.setReadTimeout(5000); // 创建RestTemplate实例,并将HttpComponentsClientHttpRequestFactory实例设置为其请求工厂 RestTemplate restTemplate = new RestTemplate(factory); ``` 2. SimpleClientHttpRequestFactory方式: ```java // 创建SimpleClientHttpRequestFactory实例 SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory(); // 设置连接超时时间(单位:毫秒) factory.setConnectTimeout(5000); // 设置读取超时时间(单位:毫秒) factory.setReadTimeout(5000); // 创建RestTemplate实例,并将SimpleClientHttpRequestFactory实例设置为其请求工厂 RestTemplate restTemplate = new RestTemplate(factory); ``` 上述代码中,使用HttpComponentsClientHttpRequestFactory或SimpleClientHttpRequestFactory创建实例,并通过setConnectTimeout和setReadTimeout方法设置连接超时时间和读取超时时间,单位都是毫秒。然后将创建的请求工厂实例设置RestTemplate实例,从而实现对HTTP请求的超时时间进行设置。 以此设置超时时间后,RestTemplate在发送HTTP请求时,如果请求等待时间超过设置超时时间,将会抛出SocketTimeoutException异常,开发者可以根据需要进行相应的处理。 ### 回答3: 在使用RestTemplate发送HTTP请求时,可以通过设置超时时间来控制请求的响应时间RestTemplateSpring框架中的一个HTTP请求客户端,它提供了一些用于发送HTTP请求的方法。要设置RestTemplate超时时间,可以通过修改其底层的HttpClient或OkHttpClient实例来实现。下面给出两种方法来设置RestTemplate超时时间。 方法一:通过修改HttpClient实例来设置超时时间。 ```java // 创建HttpComponentsClientHttpRequestFactory实例 HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(); // 设置连接超时时间 factory.setConnectTimeout(5000); // 设置读取超时时间 factory.setReadTimeout(5000); // 创建RestTemplate实例,并设置其RequestFactory属性为HttpComponentsClientHttpRequestFactory实例 RestTemplate restTemplate = new RestTemplate(); restTemplate.setRequestFactory(factory); ``` 方法二:通过修改OkHttpClient实例来设置超时时间。 ```java // 创建OkHttpClient.Builder实例 OkHttpClient.Builder builder = new OkHttpClient.Builder(); // 设置连接超时时间 builder.connectTimeout(5, TimeUnit.SECONDS); // 设置读取超时时间 builder.readTimeout(5, TimeUnit.SECONDS); // 创建OkHttpClient实例 OkHttpClient client = builder.build(); // 创建OkHttp3ClientHttpRequestFactory实例,并设置其OkHttpClient属性为上面创建的OkHttpClient实例 OkHttp3ClientHttpRequestFactory factory = new OkHttp3ClientHttpRequestFactory(client); // 创建RestTemplate实例,并设置其RequestFactory属性为OkHttp3ClientHttpRequestFactory实例 RestTemplate restTemplate = new RestTemplate(); restTemplate.setRequestFactory(factory); ``` 通过以上两种方法,我们可以根据需要设置RestTemplate的连接超时时间和读取超时时间,来控制请求的响应时间

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值