2011-05-20 25 views
12

Ciao Sto usando Apache HTTP Client 4.0 per caricare alcuni file su un server basato su protocollo HTTPS. L'applicazione caricata è in esecuzione 24x7. Oggi improvvisamente ha iniziato a gettare questo eccezione-java.net.SocketException: Spazio buffer non disponibile (connessioni massime raggiunte?): 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) 

Qualcuno può aiutarmi? Sono totalmente all'oscuro di quello che sta succedendo?

Questo è il codice sorgente che caricare il file -

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

Su quale sistema operativo è in esecuzione? – Jacob

+0

Microsoft Windows Server 2003, macchina a 32 bit – user381878

+0

Uno dei dati aggiuntivi - ha mostrato che questa eccezione veniva lanciata 16 volte poiché il programma principale chiama questo programma di caricamento ogni ora. La diciassettesima volta ha lanciato una nuova eccezione: java.net.BindException: Indirizzo già in uso: connect – user381878

risposta

20

mia ipotesi: siete a corto di porte e il problema non è direttamente correlata al codice, ma allo stato attuale del server. Troppe connessioni sono aperte ad altre macchine e questo causa il problema.

cosa cercare:

  • è il server in condizioni di utilizzo pesante che potrebbe causare più connessioni di rete da aprire?
  • HTTP client documentation consiglia di istanziare solo uno HttpClient e riutilizzare questa istanza. Si tratta di cases in cui la creazione di istanze di più client HTTP e il mancato rilascio delle connessioni fa sì che le connessioni di rete impilino e non vengano mai chiuse. Prova a httpPost.releaseConnection(). Potresti anche essere interessato alla documentazione del client HTTP, chapter 1.1.5, "Ensuring release of low level resources"
+0

Grazie. Il tuo consigliere ha funzionato. – user381878

+0

Ciao user381878, Se questo ti è stato di aiuto, puoi spiegare dove hai effettivamente effettuato la configurazione nel server? o hai usato - httpPost.releaseConnection() da qualche parte. –

1

Può succedere perché il server (database/Http) è esaurito di connessioni. Utilizzare un pool di connessioni o ridurre le connessioni massime può risolvere questo problema.

1

Il server deve pochi "porta temporanea" definito se segue ai collegamenti: http://dbaktiar-on-java.blogspot.ro/2010/03/hudson-shows-buffer-space-available.html http://support.microsoft.com/kb/196271

Questo è risolto: seguito i passaggi sopra un "fuori di prese" errori sono andati.

Il numero è limitato al server 2003.

+3

La tua risposta è solo un collegamento a una risposta; se questo link cambia, la risposta diventa irrilevante. Si prega di inviare qui qualsiasi codice/documentazione pertinente per rendere corretta la risposta. – rfornal

+0

Il collegamento KB _should_ è considerato attendibile. Questa è una risposta corretta per Windows Server 2003. Esiste un problema correlato in Windows Server 2008 R2 e R2 SP1. Ho raccolto tutte le informazioni in una risposta esaustiva a una domanda StackOverflow diversa su cui ho postato un link su questo thread. –

1

Questo sembra essere un problema di Windows, sia su porte effimere, sia su un errore in afd.sys, a seconda della versione di Windows. Consultare to my answer to a similar question on stackoverflow

+0

no, abbiamo lo stesso problema su Linux e PostgreSQL –

+0

Avere gli stessi sintomi non significa che tu abbia la stessa causa. Con questo tipo di problema, la causa è diversa a seconda della versione del sistema operativo e del sistema operativo. Questa particolare occorrenza si è verificata su Windows Server 2003 a 32 bit, per cui la causa e la cura sono ben documentate, come indicato sopra. –

+0

Non si è mai verificato questo problema su osx, su Windows abbastanza frequenti. PS: Non sono un fan della mela, le loro batterie incollate non sono la mia scelta, ma adoro il sistema operativo per la sua stabilità e affidabilità. –

Problemi correlati