5 回答

TA貢獻1802條經驗 獲得超6個贊
我也嘗試過將連接/套接字超時設置為 0,如此處和其他地方所建議的那樣。它最終沒有幫助。
還有另一種解決方案/解決方法,由 spring-data-elasticsearch 在 https://jira.spring.io/browse/DATAES-789中建議。如果出現此類異常,它只會執行內部重試。它并沒有真正解決問題,但您的客戶不會收到錯誤消息。相反,空閑時間后的第一個請求將額外花費 5 秒(或您配置的任何超時)。
如果你使用的是springboot-data-elasticsearch version 4+(從Springboot 2.3.0開始),那么你就可以應用該方案。
我可以確認以下解決方案有效(具有我上面提到的限制):
@Configuration
public class ElasticSearchRestClientConfig extends AbstractElasticsearchConfiguration {
@Autowired
private RestHighLevelClient restHighLevelClient;
@Override
public RestHighLevelClient elasticsearchClient() {
return restHighLevelClient;
}
@Bean
@Override
public ElasticsearchCustomConversions elasticsearchCustomConversions() {
return new ElasticsearchCustomConversions();
}
@Override
public ElasticsearchOperations elasticsearchOperations(ElasticsearchConverter elasticsearchConverter) {
return new ElasticsearchRestTemplate(elasticsearchClient(), elasticsearchConverter) {
@Override
public <T> T execute(ClientCallback<T> callback) {
int retryCount = 0;
T t = null;
while (retryCount <= RestClientBuilder.DEFAULT_MAX_CONN_PER_ROUTE && t == null) {
try {
t = super.execute(callback);
} catch (DataAccessResourceFailureException e) {
// retry
if (e.getCause() != null && (e.getCause().getCause() instanceof SocketTimeoutException) &&
(retryCount < RestClientBuilder.DEFAULT_MAX_CONN_PER_ROUTE)) {
retryCount++;
log.warn("Elasticsearch client - performing retry {} after caught DataAccessResourceFailureException: {}", retryCount, e.getMessage());
}
else {
throw e;
}
}
}
return t;
}
};
}

TA貢獻1829條經驗 獲得超4個贊
在RestClientBuilder.createHttpClient()默認情況下,套接字超時和連接超時設置為 30 和 10 秒。
您可以通過實施RestClientBuilder.RequestConfigCallback和調用 setRequestConfigCallback(...)您的RestHighLevelClient
我們做了類似的事情
@Override
public RequestConfig.Builder customizeRequestConfig(RequestConfig.Builder builder) {
return builder.setSocketTimeout(socketTimeout); // try to prevent SocketTimeoutException
}

TA貢獻1777條經驗 獲得超3個贊
這是我解決這個問題的方法:
@Configuration
@EnableElasticsearchRepositories(basePackages = "com.hamdos.repositories.es")
@ComponentScan(basePackages = { "com.hamdos.services.es" })
@Order(2)
public class Config {
@Bean
RestHighLevelClient client() {
RestClientBuilder builder = RestClient.builder(
new HttpHost("localhost", 9289))
.setRequestConfigCallback(
new RestClientBuilder.RequestConfigCallback() {
@Override
public RequestConfig.Builder customizeRequestConfig(
RequestConfig.Builder requestConfigBuilder) {
return requestConfigBuilder
.setConnectTimeout(5000)
.setSocketTimeout(60000);
}
});
return new RestHighLevelClient(builder);
}
@Bean
public ElasticsearchOperations elasticsearchTemplate() {
return new ElasticsearchRestTemplate(client());
}
}

TA貢獻1874條經驗 獲得超12個贊
@Bean
override fun elasticsearchClient(): RestHighLevelClient {
val clientConfiguration = ClientConfiguration
.builder()
.connectedTo("localhost:9200")
.withSocketTimeout(enter time in millisecond)
.build()`enter code here`
return RestClients.create(clientConfiguration).rest()
}
只需像上面顯示的那樣使用 withSocketTimeout(30000) mthode

TA貢獻1772條經驗 獲得超8個贊
它也應該可以通過屬性進行配置:
spring.elasticsearch.jest.connection-timeout=3000 # Connection timeout in milliseconds. spring.elasticsearch.jest.multi-threaded=true # Enable connection requests from multiple execution threads.
添加回答
舉報