有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java POST API请求超时问题

我正在尝试通过API代理对外部API进行API后调用。我在进行API调用时遇到一些超时问题。我使用下面的restTemplate发出API请求。但同时,我已经实现了在任何超时情况下对模板的重试。我可以通过再次重试该api请求来避免此问题。但我想找出根本原因,彻底解决这个问题。有人能帮我吗

StackTrace:

    org.springframework.web.client.ResourceAccessException: I/O error on POST request for "https://localhost:8080/test": Operation timed out (Read failed); nested exception is java.net.SocketException: Operation timed out (Read failed)

 private static final int HTTP_CLIENT_RETRY_COUNT = 3;
        private static final int MAXIMUM_TOTAL_CONNECTION = 10;
        private static final int MAXIMUM_CONNECTION_PER_ROUTE = 5;
        private static final int CONNECTION_VALIDATE_AFTER_INACTIVITY_MS = 10 * 1000;
        public static RestTemplate createRestTemplate(int connectionTimeoutMs, int readTimeoutMs, ObjectMapper objectMapper) {
            HttpClientBuilder clientBuilder = HttpClients.custom();
            PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();
            // Set the maximum number of total open connections.
            connectionManager.setMaxTotal(MAXIMUM_TOTAL_CONNECTION);
            // Set the maximum number of concurrent connections per route, which is 2 by default.
            connectionManager.setDefaultMaxPerRoute(MAXIMUM_CONNECTION_PER_ROUTE);
            connectionManager.setValidateAfterInactivity(CONNECTION_VALIDATE_AFTER_INACTIVITY_MS);
            clientBuilder.setConnectionManager(connectionManager);
            clientBuilder.setRetryHandler(new DefaultHttpRequestRetryHandler(HTTP_CLIENT_RETRY_COUNT, true, new ArrayList<>()) {
                @Override
                public boolean retryRequest(IOException exception, int executionCount, HttpContext context) {
                    LOGGER.info("Retry request, execution count: {}, exception: {}", executionCount, exception);
                    return super.retryRequest(exception, executionCount, context);
                }
            });
            HttpComponentsClientHttpRequestFactory httpRequestFactory = new HttpComponentsClientHttpRequestFactory(clientBuilder.build());
            httpRequestFactory.setConnectTimeout(connectionTimeoutMs);
            httpRequestFactory.setConnectionRequestTimeout(readTimeoutMs);
            httpRequestFactory.setReadTimeout(readTimeoutMs);
            RestTemplate restTemplate = new RestTemplate(httpRequestFactory);
            List<ClientHttpRequestInterceptor> interceptors = new ArrayList<ClientHttpRequestInterceptor>();
            interceptors.add(new LoggingRequestInterceptor());
            restTemplate.setInterceptors(interceptors);
            restTemplate.setRequestFactory(new BufferingClientHttpRequestFactory(httpRequestFactory));
            MappingJackson2HttpMessageConverter messageConverter = restTemplate.getMessageConverters().stream().filter(MappingJackson2HttpMessageConverter.class::isInstance)
                    .map(MappingJackson2HttpMessageConverter.class::cast).findFirst().orElseThrow(() -> new RuntimeException("MappingJackson2HttpMessageConverter not found"));
            messageConverter.setObjectMapper(objectMapper);
            restTemplate.getMessageConverters().stream().filter(StringHttpMessageConverter.class::isInstance).map(StringHttpMessageConverter.class::cast).forEach(a -> {
                a.setWriteAcceptCharset(false);
                a.setDefaultCharset(StandardCharsets.UTF_8);
            });
            return restTemplate;
}

共 (0) 个答案