亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

ES Rest 高級客戶端在空閑一段時間后拋出 SocketTimeoutException

ES Rest 高級客戶端在空閑一段時間后拋出 SocketTimeoutException

斯蒂芬大帝 2023-02-23 16:50:16
RestHighLevelClient用于在 spring-boot 應用程序中連接到 ES 6.4(托管在 AWS 上)。當應用程序空閑一段時間后,請求到達,然后RestHighLevelClient拋出SocketTimeoutException:[Request processing failed; nested exception is org.springframework.data.elasticsearch.ElasticsearchException: Error while bulk for request: org.elasticsearch.action.bulk.BulkRequest@21511b6c] wjava.net.SocketTimeoutException: 5,000 milliseconds timeout on connection http-outgoing-38 [ACTIVE]at org.apache.http.nio.protocol.HttpAsyncRequestExecutor.timeout(HttpAsyncRequestExecutor.java:387) ~[httpcore-nio-4.4.11.jar!/:4.4.11]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.11.jar!/:4.4.11]RestHighLevelClient 是使用以下方法創建的:    @Bean    RestHighLevelClient client() {        ClientConfiguration clientConfiguration = ClientConfiguration.builder()                .connectedTo(elasticsearchHostAndPort)                .build();        return RestClients.create(clientConfiguration).rest();    }spring-data-elasticsearch3.2.0.M2使用的版本。任何提示/解決方法?
查看完整描述

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;

            }

        };

    }

 


查看完整回答
反對 回復 2023-02-23
?
浮云間

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

}


查看完整回答
反對 回復 2023-02-23
?
慕森王

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());

    }

}


查看完整回答
反對 回復 2023-02-23
?
HUWWW

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


查看完整回答
反對 回復 2023-02-23
?
料青山看我應如是

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.



查看完整回答
反對 回復 2023-02-23
  • 5 回答
  • 0 關注
  • 1601 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號