hc-httpclient-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Ken Krugler <kkrugler_li...@transpac.com>
Subject Re: Connection Shutdown Immediately on HttpClient 4.01
Date Thu, 24 Jun 2010 15:45:09 GMT
Hi Oleg,

On Jun 24, 2010, at 6:54am, Oleg Kalnichevski wrote:

> On Thu, 2010-06-24 at 05:42 -0700, Ken Krugler wrote:
>> On Jun 23, 2010, at 8:24pm, ctg3 wrote:
>>
>>>
>>> I am having an issue with HttpClient 4.01. When I try to access
>>> www.google.com or any other website I get a  
>>> "java.net.SocketException:
>>> Permission denied: connect". There is no firewall or other software
>>> blocking
>>> Java and there are no proxies involved.
>>
>> I'm assuming you've tried the same thing, and run into the same
>> problem, without your custom keep-alive and retry handlers, yes?
>>
>> -- Ken
>>
>
> It is all very simple. The application does not have permissions to  
> open
> outgoing connections. This problem has nothing to do with HttpClient.
> This looks like an OS level permission issue.

I believe you :) but I've never run into such a thing before for  
outgoing connections.

Are there common examples of configuration issues would cause such a  
problem?

Thanks,

-- Ken

PS - FWIW, I see that there's a bug logged against JDK7 that could  
cause this, though might be specific to using a VPN client that  
disabled IPv6:

http://forums.java.net/jive/thread.jspa?messageID=399654&tstart=0

>>> Here is the stack trace:
>>>
>>> 2010-06-23 21:42:57,803 [main] DEBUG
>>> org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager -
>>> ThreadSafeClientConnManager.getConnection:
>>> HttpRoute[{}->http://www.google.com], timeout = 15000
>>> 2010-06-23 21:42:57,806 [main] DEBUG
>>> org.apache.http.impl.conn.tsccm.ConnPoolByRoute - Total connections
>>> kept
>>> alive: 0
>>> 2010-06-23 21:42:57,807 [main] DEBUG
>>> org.apache.http.impl.conn.tsccm.ConnPoolByRoute - Total issued
>>> connections:
>>> 0
>>> 2010-06-23 21:42:57,808 [main] DEBUG
>>> org.apache.http.impl.conn.tsccm.ConnPoolByRoute - Total allocated
>>> connection: 0 out of 5
>>> 2010-06-23 21:42:57,810 [main] DEBUG
>>> org.apache.http.impl.conn.tsccm.ConnPoolByRoute - No free  
>>> connections
>>> [HttpRoute[{}->http://www.google.com]][null]
>>> 2010-06-23 21:42:57,810 [main] DEBUG
>>> org.apache.http.impl.conn.tsccm.ConnPoolByRoute - Available
>>> capacity: 2 out
>>> of 2 [HttpRoute[{}->http://www.google.com]][null]
>>> 2010-06-23 21:42:57,811 [main] DEBUG
>>> org.apache.http.impl.conn.tsccm.ConnPoolByRoute - Creating new
>>> connection
>>> [HttpRoute[{}->http://www.google.com]]
>>> 2010-06-23 21:42:58,126 [main] DEBUG
>>> org.apache.http.impl.conn.DefaultClientConnection - Connection shut
>>> down
>>> 2010-06-23 21:42:58,127 [main] DEBUG
>>> org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager -  
>>> Released
>>> connection is not reusable.
>>> 2010-06-23 21:42:58,128 [main] DEBUG
>>> org.apache.http.impl.conn.tsccm.ConnPoolByRoute - Releasing  
>>> connection
>>> [HttpRoute[{}->http://www.google.com]][null]
>>> 2010-06-23 21:42:58,128 [main] DEBUG
>>> org.apache.http.impl.conn.tsccm.ConnPoolByRoute - Notifying no-one,
>>> there
>>> are no waiting threads
>>> java.net.SocketException: Permission denied: connect
>>> 	at java.net.PlainSocketImpl.socketConnect(Native Method)
>>> 	at java.net.PlainSocketImpl.doConnect(Unknown Source)
>>> 	at java.net.PlainSocketImpl.connectToAddress(Unknown Source)
>>> 	at java.net.PlainSocketImpl.connect(Unknown Source)
>>> 	at java.net.SocksSocketImpl.connect(Unknown Source)
>>> 	at java.net.Socket.connect(Unknown Source)
>>> 	at
>>> org
>>> .apache
>>> .http
>>> .conn
>>> .scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java: 
>>> 123)
>>> 	at
>>> org
>>> .apache
>>> .http
>>> .impl
>>> .conn
>>> .DefaultClientConnectionOperator
>>> .openConnection(DefaultClientConnectionOperator.java:123)
>>> 	at
>>> org
>>> .apache 
>>> .http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:
>>> 147)
>>> 	at
>>> org
>>> .apache
>>> .http
>>> .impl
>>> .conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:
>>> 108)
>>> 	at
>>> org
>>> .apache
>>> .http
>>> .impl
>>> .client.DefaultRequestDirector.execute(DefaultRequestDirector.java:
>>> 415)
>>> 	at
>>> org
>>> .apache
>>> .http 
>>> .impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:
>>> 641)
>>> 	at
>>> org
>>> .apache
>>> .http 
>>> .impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:
>>> 576)
>>> 	at
>>> org
>>> .apache
>>> .http 
>>> .impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:
>>> 554)
>>>
>>> Here is my HttpClient code:
>>>
>>>      HttpParams params = new BasicHttpParams();
>>>       ConnManagerParams.setMaxTotalConnections(params, 5);
>>>       ConnManagerParams.setTimeout(params, 15 * 1000);
>>>       HttpConnectionParams.setStaleCheckingEnabled(params, true);
>>>       HttpConnectionParams.setConnectionTimeout(params, 15 * 1000);
>>>       HttpConnectionParams.setSoTimeout(params, 20 * 1000);
>>>       HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
>>>
>>>       // Create and initialize scheme registry
>>>       SchemeRegistry schemeRegistry = new SchemeRegistry();
>>>       schemeRegistry.register(new Scheme("http",
>>> PlainSocketFactory.getSocketFactory(), 80));
>>>       schemeRegistry.register(new Scheme("https",
>>> SSLSocketFactory.getSocketFactory(), 443));
>>>
>>>       // Create an HttpClient with the ThreadSafeClientConnManager.
>>>       // This connection manager must be used if more than one
>>> thread will
>>>       // be using the HttpClient.
>>>       ClientConnectionManager cm = new
>>> ThreadSafeClientConnManager(params,
>>> schemeRegistry);
>>>
>>>       httpclient = new DefaultHttpClient(cm, params);
>>>
>>>       httpclient.setKeepAliveStrategy(new
>>> ConnectionKeepAliveStrategy() {
>>>
>>>           @Override
>>>           public long getKeepAliveDuration(HttpResponse response,
>>> HttpContext context) {
>>>               // default keep alive for 100 seconds
>>>               long keepAlive = 100 * 1000;
>>>
>>>               // Honor 'keep-alive' header
>>>               HeaderElementIterator it = new
>>> BasicHeaderElementIterator(
>>>                        
>>> response.headerIterator(HTTP.CONN_KEEP_ALIVE));
>>>               while (it.hasNext()) {
>>>                   HeaderElement he = it.nextElement();
>>>                   String param = he.getName();
>>>                   String value = he.getValue();
>>>                   if (value != null &&
>>> param.equalsIgnoreCase("timeout"))
>>> {
>>>                       try {
>>>                           keepAlive = Long.parseLong(value) * 1000;
>>>                           break;
>>>                       } catch (NumberFormatException ex) {
>>>                           if (log.isInfoEnabled()) {
>>>                               log.warn("Unable to parse timeout
>>> within
>>> http header", ex);
>>>                           }
>>>                       }
>>>                   }
>>>               }
>>>               // if you want custom keep-alive for a specific target
>>>               //HttpHost target = (HttpHost)
>>> context.getAttribute(ExecutionContext.HTTP_TARGET_HOST);
>>>
>>>               return keepAlive;
>>>           }
>>>       });
>>>
>>>       httpclient.setHttpRequestRetryHandler(new
>>> HttpRequestRetryHandler()
>>> {
>>>
>>>           @Override
>>>           public boolean retryRequest(
>>>                   IOException exception,
>>>                   int executionCount,
>>>                   HttpContext context) {
>>>               if (executionCount >= 5) {
>>>                   // Do not retry if over max retry count
>>>                   return false;
>>>               }
>>>               if (exception instanceof NoHttpResponseException) {
>>>                   // Retry if the server dropped connection on us
>>>                   return true;
>>>               }
>>>               if (exception instanceof SSLHandshakeException) {
>>>                   // Do not retry on SSL handshake exception
>>>                   return false;
>>>               }
>>>               HttpRequest request = (HttpRequest)
>>> context.getAttribute(
>>>                       ExecutionContext.HTTP_REQUEST);
>>>               boolean idempotent = !(request instanceof
>>> HttpEntityEnclosingRequest);
>>>               if (idempotent) {
>>>                   // Retry if the request is considered idempotent
>>>                   return true;
>>>               }
>>>               return false;
>>>           }
>>>       });
>>>
>>> And the get request code:
>>>
>>>       final HttpGet httpget = new HttpGet(URL);
>>>       HttpResponse response = null;
>>>       HttpEntity entity = null;
>>>       String entityContent = null;
>>>
>>>       try {
>>>           response = httpclient.execute(httpget);
>>>           entity = response.getEntity();
>>>
>>>           if (entity != null) {
>>>               entity.consumeContent();
>>>           }
>>>       } catch (UnknownHostException ex) {
>>>           httpget.abort();
>>>           entityContent = null;
>>>           if (log.isDebugEnabled()) {
>>>               log.debug("Unable to reach host", ex);
>>>           }
>>>       } catch (IOException ex) {
>>>           httpget.abort();
>>>           entityContent = null;
>>>           log.error("Unable to consume entity content", ex);
>>>       } catch (RuntimeException ex) {
>>>           // In case of an unexpected exception you may want to  
>>> abort
>>>           // the HTTP request in order to shut down the underlying
>>>           // connection and release it back to the connection
>>> manager.
>>>           httpget.abort();
>>>           entityContent = null;
>>>           log.error("Unexpected exception during runtime", ex);
>>>       }
>>> -- 
>>> View this message in context: http://old.nabble.com/Connection-Shutdown-Immediately-on-HttpClient-4.01-tp28978594p28978594.html
>>> Sent from the HttpClient-User mailing list archive at Nabble.com.
>>>

--------------------------------------------
Ken Krugler
+1 530-210-6378
http://bixolabs.com
e l a s t i c   w e b   m i n i n g





---------------------------------------------------------------------
To unsubscribe, e-mail: httpclient-users-unsubscribe@hc.apache.org
For additional commands, e-mail: httpclient-users-help@hc.apache.org


Mime
View raw message