2011-05-20 10 views
12

Hola, estoy usando Apache HTTP Client 4.0 para cargar algunos archivos en un servidor basado en el protocolo HTTPS. La aplicación cargada se está ejecutando 24x7. Hoy de repente comenzó a arrojar esta excepción:java.net.SocketException: no hay espacio en el búfer disponible (¿se alcanzaron las conexiones máximas?): Connect

java.net.SocketException: No buffer space available (maximum connections reached?): 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 com.sun.net.ssl.internal.ssl.SSLSocketImpl.connect(Unknown Source) 
    at org.apache.http.conn.ssl.SSLSocketFactory.connectSocket(SSLSocketFactory.java:333) 
    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:101) 
    at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:381) 
    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) 

¿Alguien puede ayudarme? No tengo ni idea de lo que está pasando?

Este es el código fuente, que cargar el archivo -

public File call() throws Exception {   
      HttpClient httpclient = new DefaultHttpClient(); 
     try{    
      httpclient.getParams().setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);   
      /* 
      * Create POST REQUEST 
      */ 
      HttpPost httpPost = new HttpPost(this.URL); 
      /* 
      * Create MultipartRequestEntity 
      */ 
      MultipartEntity multipartEntity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE); 
      /* 
      * Add POST Parameters 
      */ 
      multipartEntity.addPart(parameters[0], this.fileBody); 
      multipartEntity.addPart(parameters[1], new StringBody(this.TYPE)); 
      multipartEntity.addPart(parameters[2], new StringBody(this.MAAID)); 
      /* 
      * Add this POST Method 
      */ 
      httpPost.setEntity(multipartEntity); 
      /* 
      * Upload the file 
      */ 
      HttpResponse response = httpclient.execute(httpPost); 
      int responseCode = response.getStatusLine().getStatusCode(); 
      logger.info("Response Code of HTTP Connectivity ["+ responseCode + "], " + 
                  "it means ["+ response.getStatusLine().getReasonPhrase()+"]"); 
      /* 
      * Check the server Response 
      */ 
      HttpEntity entity = response.getEntity(); 
      if(entity != null){ 
       String status = EntityUtils.toString(entity); 
       logger.info("Status of file upload from Server >>"+ status+"<<"); 
       entity.consumeContent(); 
       if(status.equalsIgnoreCase("OK")){ 
        return this.fileBody.getFile(); 
       } 
      }else{ 
       logger.error("Unable to retrieve status of file upload from server"); 
      }   
     }catch(NoRouteToHostException e){ 
      logger.error("Internet connection to ["+ this.URL + "] is not available", e); 
     }catch(SocketException e){ 
      logger.error("Unable to connect to "+ this.URL, e); 
     }catch (Exception e) {   
      logger.error("Exception while uploading the file["+ this.fileBody.getFilename()+ "] on ["+ this.URL+"]", e); 
     }finally{ 
      try{ 
       httpclient.getConnectionManager().shutdown(); 
      }catch(Exception e){ 
       // Ignore this exception 
      } 
     } 
     return null; 
    } 
+1

¿Qué sistema operativo se está ejecutando? – Jacob

+0

Microsoft Windows Server 2003, máquina de 32 bits – user381878

+0

Una información adicional: , los registros mostraron que esta excepción se lanzó 16 veces, ya que el programa principal llama a este programa de carga cada hora. En 17ª vez, arrojó una nueva excepción: java.net.BindException: Dirección que ya está en uso: connect – user381878

Respuesta

20

Mi suposición: que se están quedando sin puertos y el problema no está directamente relacionada con su código sino al estado actual de su servidor. Demasiadas conexiones se abren en otras máquinas y esto causa el problema.

Lo que debe buscar:

  • se va a abrir su servidor en condiciones de uso pesado que podría causar múltiples conexiones de red?
  • El HTTP client documentation recomienda crear una instancia solo de HttpClient y reutilizar esta instancia. Son cases donde crear instancias de múltiples clientes HTTP y no liberar conexiones correctamente hace que las conexiones de red se acumulen y nunca se cierren. Intenta httpPost.releaseConnection(). Usted también puede estar interesado en la documentación de cliente HTTP, chapter 1.1.5, "Ensuring release of low level resources"
+0

Gracias. Tu aconsejado funcionó. – user381878

+0

Hola usuario381878, Si esto le ayudó, ¿puede explicar dónde realmente hizo la configuración en el servidor? o usaste - httpPost.releaseConnection() en alguna parte. –

1

puede suceder porque el servidor (Base de Datos/HTTP) es expulsado de las conexiones. Usar un grupo de conexiones o reducir las conexiones máximas puede solucionar este problema.

1

El servidor tiene que pocos "puerto efímero" definido SE siguiente para enlaces: http://dbaktiar-on-java.blogspot.ro/2010/03/hudson-shows-buffer-space-available.html http://support.microsoft.com/kb/196271

Esto se resuelve: seguir los pasos anteriores un "fuera de tomas" errores se han ido.

El problema está limitado al servidor 2003.

+3

Su respuesta es solo un enlace a una respuesta; si este enlace cambia, la respuesta se vuelve irrelevante. Por favor, publique aquí cualquier código/documentación relevante para que la respuesta sea correcta. – rfornal

+0

Se debe confiar en que el enlace de KB sea permanente. Esta es una respuesta correcta para Windows Server 2003. Hay un problema relacionado en Windows Server 2008 R2 y R2 SP1. He recopilado toda la información en una respuesta completa a una pregunta diferente de stackoverflow a la que he publicado un enlace en este hilo. –

1

Esto parece ser un problema de Windows, ya sea sobre puertos efímeros, o sobre un error en afd.sys, dependiendo de su versión de Windows. Consulte to my answer to a similar question on stackoverflow

+0

no, tenemos el mismo problema en Linux y PostgreSQL –

+0

Tener los mismos síntomas no significa que tenga la misma causa. Con este tipo de problema, la causa es diferente según el sistema operativo y la versión del sistema operativo. Esta ocurrencia particular fue en Windows Server 2003 de 32 bits, para lo cual la causa y la cura están bien documentadas, como se indicó anteriormente. –

+0

Nunca tuve este problema en osx, en windows bastante frecuente. PD: No soy fanático de las manzanas, sus baterías pegadas no son mi elección, pero me encanta el sistema operativo por su estabilidad y fiabilidad. –

Cuestiones relacionadas