如何在 Spring Data Elasticsearch 2.2.3.RELEASE 中配置 Rest 高级客户端的套接字超时
How to configure the socket timeout of the Rest high level client in Spring Data Elasticsearch 2.2.3.RELEASE
我使用 Spring Boot Starter Data Elasticsearch 2.2.3.RELEASE 和 Elasticsearch v6.8.6。我为连接到集群配置了 RestHighLevelClient。
现在我在不同的操作中不断收到 SocketTimeoutException:
java.net.SocketTimeoutException: 5,000 milliseconds timeout on connection http-outgoing-95 [ACTIVE]
at org.apache.http.nio.protocol.HttpAsyncRequestExecutor.timeout(HttpAsyncRequestExecutor.java:387) ~[httpcore-nio-4.4.13.jar!/:4.4.13]
at org.apache.http.impl.nio.client.InternalIODispatch.onTimeout(InternalIODispatch.java:92) ~[httpasyncclient-4.1.4.jar!/:4.1.4]
at org.apache.http.impl.nio.client.InternalIODispatch.onTimeout(InternalIODispatch.java:39) ~[httpasyncclient-4.1.4.jar!/:4.1.4]
at org.apache.http.impl.nio.reactor.AbstractIODispatch.timeout(AbstractIODispatch.java:175) ~[httpcore-nio-4.4.13.jar!/:4.4.13]
at org.apache.http.impl.nio.reactor.BaseIOReactor.sessionTimedOut(BaseIOReactor.java:261) ~[httpcore-nio-4.4.13.jar!/:4.4.13]
at org.apache.http.impl.nio.reactor.AbstractIOReactor.timeoutCheck(AbstractIOReactor.java:502) ~[httpcore-nio-4.4.13.jar!/:4.4.13]
at org.apache.http.impl.nio.reactor.BaseIOReactor.validate(BaseIOReactor.java:211) ~[httpcore-nio-4.4.13.jar!/:4.4.13]
at org.apache.http.impl.nio.reactor.AbstractIOReactor.execute(AbstractIOReactor.java:280) ~[httpcore-nio-4.4.13.jar!/:4.4.13]
at org.apache.http.impl.nio.reactor.BaseIOReactor.execute(BaseIOReactor.java:104) ~[httpcore-nio-4.4.13.jar!/:4.4.13]
at org.apache.http.impl.nio.reactor.AbstractMultiworkerIOReactor$Worker.run(AbstractMultiworkerIOReactor.java:591) ~[httpcore-nio-4.4.13.jar!/:4.4.13]
at java.lang.Thread.run(Thread.java:748) [na:1.8.0_201]
我可以在 Spring 引导应用程序中配置套接字超时吗?如果是,在哪里。
我尝试配置我创建 RestHighLevelClient 的 ClientConfiguration 的套接字超时,但没有效果:
ClientConfiguration clientConfiguration = ClientConfiguration.builder()
.connectedTo(nodes)
.withSocketTimeout(Duration.ofSeconds(30))
.build();
RestHighLevelClient client = RestClients.create(clientConfiguration).rest();
In short, you should use setConnectTimeout
method (when building
RestClient).
所以,这是我一直在为 ES (6.5v) 使用(成功设置连接和套接字超时)的 Java String Boot (2.1.1.RELEASE) 配置。
请在直接使用以下源之前正确设置您的 ENV 变量(在 .yml 文件中)。
// yml 设置
elasticsearch:
hosts:
host1: // you can set as an array with > sign
name: hostname
port: 9200
username:
password:
connectTimeout: 6000
socketTimeout: 6000
//配置class
@Configuration
public class ElasticSearchConfig {
@Autowired
private Environment environment;
@Bean(destroyMethod = "close", name = "esHighLevelRestClient")
public RestHighLevelClient highLevelClient() {
return new RestHighLevelClient(restClientBuilder());
}
@Bean(destroyMethod = "close")
public RestClient restClient() {
return restClientBuilder().build();
}
private RestClientBuilder restClientBuilder() {
final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(AuthScope.ANY,
new UsernamePasswordCredentials(
environment.getProperty("elasticsearch.username"),
environment.getProperty("elasticsearch.password")));
// you can set N hosts
List<HttpHost> hosts = new ArrayList<>();
hosts.add(new HttpHost(
environment.getProperty("elasticsearch.hosts.host1.name", String.class),
environment.getProperty("elasticsearch.hosts.host1.port", Integer.class),
"http"));
return RestClient.builder(Iterables.toArray(hosts, HttpHost.class))
.setRequestConfigCallback(requestConfigBuilder -> requestConfigBuilder
.setConnectTimeout(environment.getProperty("elasticsearch.connectTimeout", Integer.class))
.setSocketTimeout(environment.getProperty("elasticsearch.socketTimeout", Integer.class)))
.setHttpClientConfigCallback(httpClientBuilder -> httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider));
}}
希望对您有所帮助!
这是我设置套接字连接超时的方式:
// Default is 30 sec, changed to 60 sec
RestClientBuilder builder = RestClient.builder(new HttpHost(host, port, scheme))
.setRequestConfigCallback(requestConfigBuilder -> requestConfigBuilder.setSocketTimeout(60 * 1000));
我在kotlin
中的例子:
@Configuration
class ElasticConfig(private val props: ElasticsearchInfo) : AbstractElasticsearchConfiguration() {
val port = 9200
@Bean(name = ["restHighLevelClient", "elasticsearchClient"])
override fun elasticsearchClient(): RestHighLevelClient {
val timeout = Duration.of(props.timeout ?: 10, SECONDS)
return create(builder()
.connectedTo("${props.host}:$port")
.withConnectTimeout(timeout)
.withSocketTimeout(timeout)
.build()).rest()
}
@Bean fun elasticsearchRestTemplate(): ElasticsearchRestTemplate = ElasticsearchRestTemplate(elasticsearchClient())
}
我使用 Spring Boot Starter Data Elasticsearch 2.2.3.RELEASE 和 Elasticsearch v6.8.6。我为连接到集群配置了 RestHighLevelClient。
现在我在不同的操作中不断收到 SocketTimeoutException:
java.net.SocketTimeoutException: 5,000 milliseconds timeout on connection http-outgoing-95 [ACTIVE]
at org.apache.http.nio.protocol.HttpAsyncRequestExecutor.timeout(HttpAsyncRequestExecutor.java:387) ~[httpcore-nio-4.4.13.jar!/:4.4.13]
at org.apache.http.impl.nio.client.InternalIODispatch.onTimeout(InternalIODispatch.java:92) ~[httpasyncclient-4.1.4.jar!/:4.1.4]
at org.apache.http.impl.nio.client.InternalIODispatch.onTimeout(InternalIODispatch.java:39) ~[httpasyncclient-4.1.4.jar!/:4.1.4]
at org.apache.http.impl.nio.reactor.AbstractIODispatch.timeout(AbstractIODispatch.java:175) ~[httpcore-nio-4.4.13.jar!/:4.4.13]
at org.apache.http.impl.nio.reactor.BaseIOReactor.sessionTimedOut(BaseIOReactor.java:261) ~[httpcore-nio-4.4.13.jar!/:4.4.13]
at org.apache.http.impl.nio.reactor.AbstractIOReactor.timeoutCheck(AbstractIOReactor.java:502) ~[httpcore-nio-4.4.13.jar!/:4.4.13]
at org.apache.http.impl.nio.reactor.BaseIOReactor.validate(BaseIOReactor.java:211) ~[httpcore-nio-4.4.13.jar!/:4.4.13]
at org.apache.http.impl.nio.reactor.AbstractIOReactor.execute(AbstractIOReactor.java:280) ~[httpcore-nio-4.4.13.jar!/:4.4.13]
at org.apache.http.impl.nio.reactor.BaseIOReactor.execute(BaseIOReactor.java:104) ~[httpcore-nio-4.4.13.jar!/:4.4.13]
at org.apache.http.impl.nio.reactor.AbstractMultiworkerIOReactor$Worker.run(AbstractMultiworkerIOReactor.java:591) ~[httpcore-nio-4.4.13.jar!/:4.4.13]
at java.lang.Thread.run(Thread.java:748) [na:1.8.0_201]
我可以在 Spring 引导应用程序中配置套接字超时吗?如果是,在哪里。
我尝试配置我创建 RestHighLevelClient 的 ClientConfiguration 的套接字超时,但没有效果:
ClientConfiguration clientConfiguration = ClientConfiguration.builder()
.connectedTo(nodes)
.withSocketTimeout(Duration.ofSeconds(30))
.build();
RestHighLevelClient client = RestClients.create(clientConfiguration).rest();
In short, you should use
setConnectTimeout
method (when building RestClient).
所以,这是我一直在为 ES (6.5v) 使用(成功设置连接和套接字超时)的 Java String Boot (2.1.1.RELEASE) 配置。
请在直接使用以下源之前正确设置您的 ENV 变量(在 .yml 文件中)。
// yml 设置
elasticsearch:
hosts:
host1: // you can set as an array with > sign
name: hostname
port: 9200
username:
password:
connectTimeout: 6000
socketTimeout: 6000
//配置class
@Configuration
public class ElasticSearchConfig {
@Autowired
private Environment environment;
@Bean(destroyMethod = "close", name = "esHighLevelRestClient")
public RestHighLevelClient highLevelClient() {
return new RestHighLevelClient(restClientBuilder());
}
@Bean(destroyMethod = "close")
public RestClient restClient() {
return restClientBuilder().build();
}
private RestClientBuilder restClientBuilder() {
final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(AuthScope.ANY,
new UsernamePasswordCredentials(
environment.getProperty("elasticsearch.username"),
environment.getProperty("elasticsearch.password")));
// you can set N hosts
List<HttpHost> hosts = new ArrayList<>();
hosts.add(new HttpHost(
environment.getProperty("elasticsearch.hosts.host1.name", String.class),
environment.getProperty("elasticsearch.hosts.host1.port", Integer.class),
"http"));
return RestClient.builder(Iterables.toArray(hosts, HttpHost.class))
.setRequestConfigCallback(requestConfigBuilder -> requestConfigBuilder
.setConnectTimeout(environment.getProperty("elasticsearch.connectTimeout", Integer.class))
.setSocketTimeout(environment.getProperty("elasticsearch.socketTimeout", Integer.class)))
.setHttpClientConfigCallback(httpClientBuilder -> httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider));
}}
希望对您有所帮助!
这是我设置套接字连接超时的方式:
// Default is 30 sec, changed to 60 sec
RestClientBuilder builder = RestClient.builder(new HttpHost(host, port, scheme))
.setRequestConfigCallback(requestConfigBuilder -> requestConfigBuilder.setSocketTimeout(60 * 1000));
我在kotlin
中的例子:
@Configuration
class ElasticConfig(private val props: ElasticsearchInfo) : AbstractElasticsearchConfiguration() {
val port = 9200
@Bean(name = ["restHighLevelClient", "elasticsearchClient"])
override fun elasticsearchClient(): RestHighLevelClient {
val timeout = Duration.of(props.timeout ?: 10, SECONDS)
return create(builder()
.connectedTo("${props.host}:$port")
.withConnectTimeout(timeout)
.withSocketTimeout(timeout)
.build()).rest()
}
@Bean fun elasticsearchRestTemplate(): ElasticsearchRestTemplate = ElasticsearchRestTemplate(elasticsearchClient())
}