こんにちは、Apache HTTPクライアント4.0を使用して、HTTPSプロトコルに基づくサーバーにいくつかのファイルをアップロードしています。アップロードされたアプリケーションは24時間365日稼働しています。今日突然、それはこの例外を投げ始めました-
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)
誰か助けてくれますか?私は何が起こっているのか全く分かりませんか?
これはファイルをアップロードするソースコードです-
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;
}
私の推測では、ポートが不足していて、問題はコードに直接関係しているのではなく、サーバーの現在の状態に関係しています。他のマシンに対して開かれている接続が多すぎるため、問題が発生します。
何を探すか:
HttpClient
を1つだけインスタンス化し、このインスタンスを再利用することをお勧めします。それらは cases であり、複数のHTTPクライアントをインスタンス化して接続を正しく解放しないと、ネットワーク接続がスタックされ、決して閉じられません。 httpPost.releaseConnection()
を試してください。 HTTPクライアントのドキュメントにも興味があるかもしれません 1.1.5章「低レベルのリソースのリリースを確実にする」サーバーには、リンクに続くいくつかの「エフェメラルポート」が定義されています: http://dbaktiar-on-Java.blogspot.ro/2010/03/hudson-shows-buffer-space-available.html = http://support.Microsoft.com/kb/196271
これは解決されました:上記の「ソケット不足」エラーの手順に従いました。
問題は2003サーバーに限定されています。
サーバー(データベース/ HTTP)が接続を使い果たしたために発生する可能性があります。接続プールを使用するか、最大接続数を減らすと、この問題を解決できます。
これは、Windowsのバージョンに応じて、一時的なポートまたはafd.sysのバグに関するWindowsの問題のようです。参照してください stackoverflowでの同様の質問に対する私の回答へ