http-ответ не возвращается обратно после кода состояния 503 — проблема с несколькими потоками в java

#java #multithreading #httpclient #executorservice #http-status-code-503

#java #многопоточность #httpclient #executorservice #http-status-code-503

Вопрос:

Я использую службу исполнителя с фиксированным пулом потоков, которая отправляет будущую задачу для создания XML-файлов. Каждый раз, когда он извлекает xml из URL-адреса, генерирует xml и сравнивает с существующим xml, чтобы определить, есть ли какие-либо несоответствия. Я предоставил метод fetchAPIData как синхронизированный, чтобы сделать его потокобезопасным, но это резко снижает производительность.Чтобы избежать исключения прерывания потока и сделать его потокобезопасным, я установил connectionpoolmanager при создании httpclient. Проблема, с которой я сталкиваюсь, заключается в том, что когда сервер достигает 503, он повторно подключает сеанс и повторяет попытку подключения. Как только нажат 503, он повторяет попытку и отправляет ответ, но программа, похоже, не завершается в конце.Кажется, бесконечно ждать ответов от какого-либо ответа потока.Ниже приведен мой код.Я уже пробовал

fetchAPIData Выборка данных:-

 public String fetchAPIData(URI uri) throws ClarityAPIValidatorException {

        int retryCount = 0;
        CloseableHttpResponse httpResponse = buildHttpResponse(uri,
                getClientContext(), getHttpClient());

        int statusCode = httpResponse.getStatusLine().getStatusCode();
        try {
            switch (statusCode) {
                /*StatusCode - 200*/
                case HttpStatus.SC_OK:
                    return outputBasedOnStatusCode(httpResponse);
                /*StatusCode - 401*/
                case HttpStatus.SC_UNAUTHORIZED:
                    logger.info(ClarityAPIValidatorConstants.RESPONSE_CODE   httpResponse.getStatusLine().getStatusCode()   " "  
                            ClarityAPIValidatorConstants.URL   uri);
                    createSessionWithCookies(new URI(ClarityAPIProperties.getApiBaseURL()));
                    httpResponse = buildHttpResponse(uri, getClientContext(),
                            getHttpClient());
                    return outputBasedOnStatusCode(httpResponse);
                /*StatusCode - 503*/
                case HttpStatus.SC_SERVICE_UNAVAILABLE:

                        do {
                            logger.info(ClarityAPIValidatorConstants.RESPONSE_CODE   httpResponse.getStatusLine().getStatusCode()   " "  
                                    ClarityAPIValidatorConstants.URL   uri);
                            retryCount  ;
                            this.pause(httpResponse, retryCount);
                            logger.info(ClarityAPIValidatorConstants.REQ_EXECUTING   uri);
                            createSessionWithCookies(uri);
                            httpResponse = buildHttpResponse(uri,
                                    getClientContext(), getHttpClient());
                            logger.info(ClarityAPIValidatorConstants.RETRY   ClarityAPIValidatorConstants.RESPONSE_CODE   httpResponse.getStatusLine().getStatusCode());

                        }
                        while (isRetryRequired(httpResponse, retryCount));
                        return outputBasedOnStatusCode(httpResponse);
                /*StatusCode other than 200, 401 and 503*/
                default:
                    throw new ClarityAPIValidatorException(UN_HANDLED_RES_TYPE  
                            statusCode   PATH   uri.getPath());
            }
        } catch (IOException | URISyntaxException e) {
            e.printStackTrace();
        }

        return null;
    }
 

createsessioncookie

  public void createSessionWithCookies(URI uri) throws ClarityAPIValidatorException {
        CredentialsProvider provider =
                buildCredentialsProvider(ClarityAPIProperties.getApiUsername(),
                        ClarityAPIProperties.getApiPassword());
        CloseableHttpClient httpClient = buildHttpClient(provider);
        HttpClientContext clientContext = buildHttpClientContext(uri, provider);

        if (httpClient == null || clientContext == null) {
            throw new ClarityAPIValidatorException(CREATE_SESSION_ERROR);
        } else {
            this.setHttpClient(httpClient);
            this.setClientContext(clientContext);
        }
    }
 

buildHttpClient :-

  public CloseableHttpClient buildHttpClient(CredentialsProvider provider) {
        RequestConfig requestConfig = RequestConfig.custom()
                .setCookieSpec(CookieSpecs.STANDARD)
                .build();
        PoolingHttpClientConnectionManager connManager =
                new PoolingHttpClientConnectionManager();
        
        return HttpClientBuilder.create()
                .setDefaultCredentialsProvider(provider)
                .setDefaultRequestConfig(requestConfig)
                .setConnectionManager(connManager)
                .build();
    }
 

buildHttpResponse:-

 public  CloseableHttpResponse buildHttpResponse(URI uri,
                                                   HttpClientContext clientContext,
                                                   CloseableHttpClient httpClient)
            throws ClarityAPIValidatorException {

        HttpGet httpGet = buildHttpRequest(uri);
        CloseableHttpResponse response = null;

        try {
            response = httpClient.execute(httpGet, clientContext);
        } catch (IOException e) {
            e.printStackTrace();
            throw new ClarityAPIValidatorException(GET_REQ_FAIL   uri.getPath());
        }

        if (isNull(response))
            throw new ClarityAPIValidatorException(RES_NULL   uri.getPath());

        return response;
    }
 

isRetryRequired: — максимальная повторная попытка равна 5 с 5 секунд, 10 секунд …. до 25 секунд

  public boolean isRetryRequired(CloseableHttpResponse httpResponse,
                                   int retryCount) {
        return httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_SERVICE_UNAVAILABLE amp;amp;
                retryCount < ClarityAPIValidatorConstants.RETRY_MAX_COUNT;


    }
 

Комментарии:

1. можете ли вы прикрепить тело метода isRetryRequired ?

2. Я добавил его

3. Вы сделали дамп потока в тот момент времени, когда ваша программа не может остановиться?

4. нет … но когда я подсчитываю, 2 XML-файла не генерируются