Spring

Spring Data Elasticsearch 2.2.3.RELEASE에서 Rest 고수준 클라이언트의 소켓 시간 초과를 구성하는 방법

기록만이살길 2022. 12. 9. 17:08
반응형

Spring Data Elasticsearch 2.2.3.RELEASE에서 Rest 고수준 클라이언트의 소켓 시간 초과를 구성하는 방법

1. 질문(문제점):

Elasticsearch v6.8.6과 함께 Spring Boot Starter Data Elasticsearch 2.2.3.RELEASE를 사용합니다. 클러스터 연결을 위해 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 Boot 애플리케이션에서 소켓 시간 초과를 구성할 수 있습니까? 그렇다면 어디에서.

아무런 영향을 미치지 않는 RestHighLevelClient를 생성하는 ClientConfiguration의 소켓 시간 초과 구성을 시도했습니다.

    ClientConfiguration clientConfiguration = ClientConfiguration.builder()
            .connectedTo(nodes)
            .withSocketTimeout(Duration.ofSeconds(30))
            .build();

    RestHighLevelClient client = RestClients.create(clientConfiguration).rest();

2. 해결방안:

즉, 메서드를 사용해야 합니다 setConnectTimeout(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

// 구성 클래스

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

도움이 되길 바랍니다!

반응형