Java >> Java tutorial >  >> Tag >> throw

ES Rest High Level Client kaster SocketTimeoutException efter at have været inaktiv i et stykke tid

Jeg har også prøvet at indstille timeout for forbindelse/stik til 0, som foreslået her og andre steder. Det hjalp ikke til sidst.

Der er en anden løsning/løsning, foreslået af spring-data-elasticsearch på https://jira.spring.io/browse/DATAES-789. Den udfører simpelthen et internt forsøg igen i tilfælde af en sådan undtagelse. Det løser ikke rigtig problemet, men din klient vil ikke få og fejle. I stedet vil den første anmodning efter inaktiv tid tage yderligere 5 sekunder (eller hvilken timeout du nu har konfigureret).

Hvis du bruger Springboot-data-elasticsearch version 4+ (med Springboot 2.3.0), så kan du anvende løsningen.

Jeg kan bekræfte, at følgende løsning virker (med de begrænsninger, jeg nævnte ovenfor):


@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;
            }
        };
    }
 

I RestClientBuilder.createHttpClient() standardindstillingerne for socket timeout og forbindelses timeout er indstillet til 30 og 10 sekunder.

Du kan tilsidesætte disse standarder ved at implementere RestClientBuilder.RequestConfigCallback og kalder setRequestConfigCallback(...) på din RestHighLevelClient

Vi gjorde noget lignende

@Override
public RequestConfig.Builder customizeRequestConfig(RequestConfig.Builder builder) {
    return builder.setSocketTimeout(socketTimeout); // try to prevent SocketTimeoutException
}

Java tag