| Цитата(slippery @ 2.6.2016, 12:48) | Добрый день. У меня есть проблема с http client от apache. И так у меня есть 2 сервера которые взаимодействует между собой по REST. Назовем тот, что принимает запросы(имеет АПИ) - Сервер, а тот, что посылает - Клиент. Сервер крутится на 8 томкате и АПИ реализован как @Controller от spring версии 4.2.5. Клиент же крутится в jboss(4.2.3.GA) и основан тоже на spring 3.2.12. Клиент использует RestTemplate для вызова АПИ на Сервере. Некоторые методы АПИ на сервере выполняются довольно таки долго, 15-25 секунд. И иногда при выполнении таких методов я получаю следующую ошибку:
| Код |
org.apache.http.NoHttpResponseException: The target server failed to respond at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:95) at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:62)
|
при этом не смотря на исключение, запрос от Клиента доходит до Сервера выполняется там секунд 15-20 и затем вылетает это исключение. С запросами которые выполняются 1-2 секунды таких ошибок не наблюдалось. ReadTimeout не происходит, все же время выполнения таких методов меньше.
Можете ли вы объяснить почему возникает ошибка и как я могу это исправить?
На всякий случай приведу код Клиента:
| Код | @Bean public RestTemplate restTemplate() { RestTemplate restTemplate = new RestTemplate(); restTemplate.setMessageConverters(ImmutableList.of(messageConverter)); restTemplate.setErrorHandler(errorHandler);
HttpHost host = URIUtils.extractHost(new URI("http://127.0.0.1:8080")); HttpComponentsDigestRequestFactory requestFactory = new HttpComponentsDigestRequestFactory(host,new AuthProperties("user", "password", "realm")) requestFactory.setConnectTimeout(5000); requestFactory.setReadTimeout(30000); restTemplate.setRequestFactory(requestFactory); } class HttpComponentsDigestRequestFactory extends HttpComponentsClientHttpRequestFactory {
public HttpComponentsDigestRequestFactory(@NotNull HttpHost host, @NotNull AuthProperties auth) { DefaultHttpClient httpClient = (DefaultHttpClient) getHttpClient(); httpClient.getCredentialsProvider().setCredentials(new AuthScope(host, auth.getRealm(), "DIGEST"), new UsernamePasswordCredentials(auth.getUsername(), auth.getPassword())); }
@Override protected HttpContext createHttpContext(HttpMethod httpMethod, URI uri) { AuthCache authCache = new BasicAuthCache(); DigestScheme digestScheme = new DigestScheme(); digestScheme.overrideParamter("realm", realm); authCache.put(host, digestScheme); BasicHttpContext context = new BasicHttpContext(); context.setAttribute(ClientContext.AUTH_CACHE, authCache); return context; } public void post(@NotNull String relativeUrl, @NotNull Object body, @NotNull Map<String, ?> uriVariables) { String url = gateway + relativeUrl; restTemplate.postForEntity(url, body, MyError.class, uriVariables); }
private String json(Object body) { return gson.toJson(body); }
|
|
без лога сервера трудно угадать , попробуй послать через обычную HTML форму , потом на сервере проверь все ли параметры пришли , убери credential убедись что без них работает ,
|