У меня проблемы с отсутствием соединений при вызове API отдыха с com.sun.jersey.client.apache.ApacheHttpClient и Spring Пару вызовов проходит, но вдруг я получаю:
DEBUG (org.apache.commons.httpclient.MultiThreadedHttpConnectionManager:501) : - Unable to get a connection, waiting..., hostConfig=HostConfiguration[host=www.dummyapi.com]`
вот и все. Ничего больше!
Это моё приложениеContext.xml:
<bean id="customHttpClient" class="com.sun.jersey.client.apache.ApacheHttpClient">
<constructor-arg>
<bean class="com.sun.jersey.client.apache.ApacheHttpClientHandler" >
<constructor-arg>
<bean class="org.apache.commons.httpclient.HttpClient" >
<constructor-arg>
<bean class="org.apache.commons.httpclient.MultiThreadedHttpConnectionManager" >
<property name="params">
<bean class="org.apache.commons.httpclient.params.HttpConnectionManagerParams">
<property name="defaultMaxConnectionsPerHost" value="10" />
</bean>
</property>
</bean>
</constructor-arg>
</bean>
</constructor-arg>
</bean>
</constructor-arg>
<constructor-arg ref="customClientConfiguration" />
</bean>
<bean id="customRestClient" class="com.custom.web.service.common.RestClient" >
<constructor-arg ref="customHttpClient" />
<constructor-arg value="${my.service.url}" />
</bean>
Это мои занятия:
import com.sun.jersey.client.apache.config.DefaultApacheHttpClientConfig;
import org.codehaus.jackson.jaxrs.JacksonJsonProvider;
public class CustomApacheHttpClientConfig extends DefaultApacheHttpClientConfig {
/**
* Constructor with username and password.
* @param username
* @param password
*/
public CustomApacheHttpClientConfig(final String username, final String password) {
getClasses().add(JacksonJsonProvider.class);
getProperties().put(PROPERTY_PREEMPTIVE_AUTHENTICATION, Boolean.TRUE);
getState().setCredentials(null, null, -1, username, password);
}
}
package com.custom.web.service.common;
import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import org.apache.log4j.Logger;
import org.codehaus.jackson.map.DeserializationConfig;
import org.codehaus.jackson.map.ObjectMapper;
import javax.ws.rs.core.MediaType;
import java.io.IOException;
import java.net.URI;
public class RestClient {
private static final Logger LOG = Logger.getLogger(RestClient.class);
private final String baseUrl;
private final Client client;
private final ObjectMapper objectMapper;
public RestClient(final String baseUrl, final Client client) {
this.baseUrl = baseUrl;
this.client = client;
this.objectMapper = new ObjectMapper();
this.objectMapper.getDeserializationConfig().set(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
}
public RestClient(final String baseUrl, final Client client, final ObjectMapper objectMapper) {
this.baseUrl = baseUrl;
this.client = client;
this.objectMapper = objectMapper;
}
public String getBaseUrl() {
return baseUrl;
}
public Client getClient() {
return client;
}
public ObjectMapper getObjectMapper() {
return objectMapper;
}
}
Звонок:
public void do() {
UriBuilder uriBuilder = UriBuilder.fromUri(
String.format(
this.customRestClient.getBaseUrl(),
"SE")).
path(SOME_UNIT_PATH_PARAM).
path(id).
path(SOME_OTHER_PATH_PARAM);
ClientResponse response = this.customRestClient.getClient().resource(uriBuilder.build()).get(ClientResponse.class);
if (response.getClientResponseStatus().getStatusCode() != 200) {
throw new CustomRestClientException(String.format("Something went wrong when getting stuff from rest api for id: %s %d %s ",
id, response.getClientResponseStatus().getStatusCode(),
" reasonPhrase: " + response.getClientResponseStatus().getReasonPhrase()));
}
String json = response.getEntity(String.class);
Stuff[] stuff = null;
try {
stuff = this.customRestClient.getObjectMapper().readValue(json, Stuff[].class);
} catch (IOException e) {
throw new CustomRestClientException(
String.format("Something went wrong when reading json value for stuff from api: %s %s %d %s ",
id, json, response.getClientResponseStatus().getStatusCode(), " reasonPhrase: " + e.getMessage()));
}
List<Stuff> stuffList = new ArrayList<Stuff>();
stuffList.addAll(Arrays.asList(stuff));
}
Как вы видите, я не закрываю соединение явно после каждого запроса, я оставляю это ApacheHttpClientHandler. Я пытался увеличить defaultMaxConnectionsPerHost, но не повезло. Я также просматривал веб-страницы и нашел только примеры, когда люди создают свой клиент в коде, а затем уничтожают его там. Пожалуйста, помогите мне разобраться в этом, потому что я ударился об кирпичную стену.
С уважением
Jakob!