Reputation: 197
I am having a problem with rest template exchange method. I use it to send requests to google's GCM server. Everytime the same request, only recipient differs (a field in a JSON). When I send more than 200 requests at the same time, at 207th I get the 400 Bad Request response, after that I can wait some time but still get the same response for each outgoing request from my server. It seems like my code blocks access to the networking resources. When I restart server the resources are available again. RestTemplate configuration:
<bean id="restTemplate" class="org.springframework.web.client.RestTemplate">
<constructor-arg ref="httpRequestFactory"> </constructor-arg>
</bean>
<bean id="httpRequestFactory" class="org.springframework.http.client.HttpComponentsClientHttpRequestFactory">
<constructor-arg ref="httpClient"> </constructor-arg>
<property name="connectTimeout" value="1000" />
</bean>
<bean id="httpConnectionManager" class="org.apache.http.impl.conn.PoolingClientConnectionManager">
<property name="defaultMaxPerRoute" value="50" />
<property name="maxTotal" value="100" />
</bean>
<bean id="httpClient" class="org.apache.http.impl.client.DefaultHttpClient" >
<constructor-arg ref="httpConnectionManager" />
</bean>
request:
ResponseEntity<String> response = restTemplate.exchange(
"myaddress",
HttpMethod.POST, request, String.class);
logs: DEBUG [org.springframework.web.client.RestTemplate] (gcmjmsContainer-1) Created POST request for "https://gcm-http.googleapis.com/gcm/send"
DEBUG [org.springframework.web.client.RestTemplate] (gcmjmsContainer-1) Setting request Accept header to [text/plain, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, application/*+json, */*]
DEBUG [org.springframework.web.client.RestTemplate] (gcmjmsContainer-1) Writing [{
"to" : "1",
"notification" : {
"text" : "mytext",
"click_action" : "SHOW"
},
"data" : {
"orderid" : 1,
"status" : "paid"
}
}] as "application/json" using [org.springframework.http.converter.json.MappingJackson2HttpMessageConverter@1d92cbc8]
DEBUG [org.apache.http.impl.conn.PoolingClientConnectionManager] (gcmjmsContainer-1) Connection request: [route: {s}->https://gcm-http.googleapis.com:443][total kept alive: 2; route allocated: 1 of 50; total allocated: 2 of 100]
DEBUG [org.apache.http.impl.conn.PoolingClientConnectionManager] (gcmjmsContainer-1) Connection leased: [id: 1][route: {s}->https://gcm-http.googleapis.com:443][total kept alive: 1; route allocated: 1 of 50; total allocated: 2 of 100]
DEBUG [org.apache.http.impl.client.DefaultHttpClient] (gcmjmsContainer-1) Stale connection check
DEBUG [org.apache.http.impl.client.DefaultHttpClient] (gcmjmsContainer-1) Attempt 1 to execute request
DEBUG [org.apache.http.impl.conn.DefaultClientConnection] (gcmjmsContainer-1) Sending request: POST /gcm/send HTTP/1.1
DEBUG [org.apache.http.impl.conn.DefaultClientConnection] (gcmjmsContainer-1) Receiving response: HTTP/1.1 400 Bad Request
DEBUG [org.apache.http.impl.client.DefaultHttpClient] (gcmjmsContainer-1) Connection can be kept alive indefinitely
WARN [org.springframework.web.client.RestTemplate] (gcmjmsContainer-1) POST request for "https://gcm-http.googleapis.com/gcm/send" resulted in 400 (Bad Request); invoking error handlerng error handler
Upvotes: 1
Views: 807
Reputation: 197
Actually I have found the solution the very second I posted the question. It came to my mind that there is to many entries "application/json" in the Accept header. My bug in the code was: restTemplate.getMessageConverters().add( new MappingJackson2HttpMessageConverter());
executing everytime I was sending a request using a singleton restTemplate.
Upvotes: 2