#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-файла не генерируются