/**
  * Create a new instance of the {@code AsyncRestTemplate} using the given {@link
  * AsyncTaskExecutor}.
  *
  * <p>This constructor uses a {@link SimpleClientHttpRequestFactory} in combination with the given
  * {@code AsyncTaskExecutor} for asynchronous execution.
  */
 public AsyncRestTemplate(AsyncListenableTaskExecutor taskExecutor) {
   Assert.notNull(taskExecutor, "AsyncTaskExecutor must not be null");
   SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();
   requestFactory.setTaskExecutor(taskExecutor);
   this.syncTemplate = new RestTemplate(requestFactory);
   setAsyncRequestFactory(requestFactory);
 }
  @Bean
  @Qualifier("dnsClientHttpRequestFactory")
  public SimpleClientHttpRequestFactory dnsClientHttpRequestFactory() {
    SimpleClientHttpRequestFactory clientHttpRequestFactory = new SimpleClientHttpRequestFactory();

    // Set timeouts (1 second to connect, unlimited - for response)
    clientHttpRequestFactory.setConnectTimeout(500);
    clientHttpRequestFactory.setReadTimeout(1000);

    // Setting the ThreadPoolTaskExecutor for the Async calls
    ThreadPoolTaskExecutor pool = new ThreadPoolTaskExecutor();
    pool.setCorePoolSize(5);
    pool.setMaxPoolSize(10);
    pool.setWaitForTasksToCompleteOnShutdown(true);
    pool.initialize();

    // Setting the TaskExecutor to the ThreadPoolTaskExecutor
    clientHttpRequestFactory.setTaskExecutor(pool);

    return clientHttpRequestFactory;
  }