连接池Spring rest模板-延迟问题
我正在使用带有连接池的SpringREST模板。我的应用程序必须支持高负载。当我了解到基本RestTemplate不支持池时,我在stackoverflow中找到了以下定义 这是我的实现:连接池Spring rest模板-延迟问题,spring,resttemplate,Spring,Resttemplate,我正在使用带有连接池的SpringREST模板。我的应用程序必须支持高负载。当我了解到基本RestTemplate不支持池时,我在stackoverflow中找到了以下定义 这是我的实现: @Bean public static RestTemplate restTemplate() { PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager(); connM
@Bean
public static RestTemplate restTemplate() {
PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager();
connManager.setMaxTotal(1500);
connManager.setDefaultMaxPerRoute(1500);
CloseableHttpClient client = HttpClients.custom()
.setConnectionManager(connManager)
.setMaxConnTotal(1500)
.setMaxConnPerRoute(1500)
.build();
RestTemplate restTemplate = new RestTemplate(new HttpComponentsClientHttpRequestFactory(client));
HttpComponentsClientHttpRequestFactory requestFactory = (HttpComponentsClientHttpRequestFactory) restTemplate.getRequestFactory();
requestFactory.setConnectTimeout(3000);
requestFactory.setReadTimeout(3000);
requestFactory.setConnectionRequestTimeout(3000);
return restTemplate;
}
现在,只有在高负载的情况下,我每隔一段时间就会遇到高延迟(几乎2秒)。我使用的是Vert.x,因此我可以准确地看到延迟的位置:
018-06-04 04:08:48,299 WARN io.vertx.core.impl.BlockedThreadChecker - Thread Thread[vert.x-eventloop-thread-1,5,main] has been blocked for 1872 ms, time limit is 100
io.vertx.core.VertxException: Thread blocked
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
at java.net.SocketInputStream.read(SocketInputStream.java:171)
at java.net.SocketInputStream.read(SocketInputStream.java:141)
at org.apache.http.impl.io.SessionInputBufferImpl.streamRead(SessionInputBufferImpl.java:137)
at org.apache.http.impl.io.SessionInputBufferImpl.fillBuffer(SessionInputBufferImpl.java:153)
at org.apache.http.impl.io.SessionInputBufferImpl.readLine(SessionInputBufferImpl.java:282)
at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:140)
at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:57)
at org.apache.http.impl.io.AbstractMessageParser.parse(AbstractMessageParser.java:259)
at org.apache.http.impl.DefaultBHttpClientConnection.receiveResponseHeader(DefaultBHttpClientConnection.java:163)
at org.apache.http.impl.conn.CPoolProxy.receiveResponseHeader(CPoolProxy.java:167)
at org.apache.http.protocol.HttpRequestExecutor.doReceiveResponse(HttpRequestExecutor.java:273)
at org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:125)
at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:271)
at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:184)
at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:88)
at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110)
at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:184)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:55)
at org.springframework.http.client.HttpComponentsClientHttpRequest.executeInternal(HttpComponentsClientHttpRequest.java:89)
at org.springframework.http.client.AbstractBufferingClientHttpRequest.executeInternal(AbstractBufferingClientHttpRequest.java:48)
at org.springframework.http.client.AbstractClientHttpRequest.execute(AbstractClientHttpRequest.java:53)
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:652)
at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:613)
我不认为增加游泳池的数量应该有什么作用,1500是很多(甚至可能太多)
有人能帮忙吗?
您好,我想请帮忙。我还没有设法修复它,因为您将异步编程(vertx)与阻塞调用api(resttemplate)混合在一起。您不应该阻止事件循环