2013-08-04 7 views
15

Ich habe einen RESTful-Server, der eine HTTP POST-Eingabe vom Client nimmt, um Lieder auf dem Server abzustimmen. Ich habe Apache HTTPClient für den Client verwendet.fix java.net.SocketTimeoutException: Gelesen Zeitüberschreitung

public boolean vote() { 
     HttpClient client = new DefaultHttpClient(getHttpParameters()); 
     HttpConnectionParams.setConnectionTimeout(client.getParams(), 10000); // Timeout Limit                    
     HttpResponse response; 
     try { 
      HttpPost post = new HttpPost("http://127.0.0.1:8080/ws/"); 
      StringEntity se = new StringEntity("{ \"song_id\" : \"2\" }"); 
      se.setContentType(new BasicHeader(HTTP.CONTENT_TYPE,"application/json")); 
      post.setEntity(se); 
      response = client.execute(post); 
      if (response != null) { 
       InputStream in = response.getEntity().getContent(); // Get the data in the Entity                
       String result = convertStreamToString(in); 
       return true; 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
      return false; 
     } 
     return false; 
    } 

    public static HttpParams getHttpParameters() { 
     HttpParams httpParameters = new BasicHttpParams(); 
     int timeoutConnection = 30000; 
     HttpConnectionParams.setConnectionTimeout(httpParameters, 
       timeoutConnection); 
     int timeoutSocket = 30000; 
     HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket); 
     return httpParameters; 
    } 

Wenn ich Abstimmung Taste auf Nachfolge klicken, nach wenigen Stimmen (wie 7-8), I java.net.SocketTimeoutException: Read timed out Ausnahme erhalten. Als ich nach dem Grund gesucht habe, habe ich festgestellt, dass der Client keine Server-Antwort auf Timeout-Zeit erhalten hat. Aber das Problem ist, dass wenn ich andere Anwendungen wie Chrome REST Console oder JMeter verwende, ich viele Abstimmungen auf demselben Server mit denselben Parametern und demselben Pfad abstimmen kann. Gibt es ein Problem mit meinem Java-Code? Bitte helfen Sie mir, dies herauszufinden. Folgendes ist mein Stacktrace:

java.net.SocketTimeoutException: Read timed out 
    at java.net.SocketInputStream.socketRead0(Native Method) 
    at java.net.SocketInputStream.read(Unknown Source) 
    at org.apache.http.impl.io.AbstractSessionInputBuffer.fillBuffer(AbstractSessionInputBuffer.java:166) 
    at org.apache.http.impl.io.SocketInputBuffer.fillBuffer(SocketInputBuffer.java:90) 
    at org.apache.http.impl.io.AbstractSessionInputBuffer.readLine(AbstractSessionInputBuffer.java:281) 
    at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:92) 
    at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:62) 
    at org.apache.http.impl.io.AbstractMessageParser.parse(AbstractMessageParser.java:254) 
    at org.apache.http.impl.AbstractHttpClientConnection.receiveResponseHeader(AbstractHttpClientConnection.java:289) 
    at org.apache.http.impl.conn.DefaultClientConnection.receiveResponseHeader(DefaultClientConnection.java:252) 
    at org.apache.http.impl.conn.ManagedClientConnectionImpl.receiveResponseHeader(ManagedClientConnectionImpl.java:191) 
    at org.apache.http.protocol.HttpRequestExecutor.doReceiveResponse(HttpRequestExecutor.java:300) 
    at org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:127) 
    at org.apache.http.impl.client.DefaultRequestDirector.tryExecute(DefaultRequestDirector.java:715) 
    at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:520) 
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:906) 
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:805) 
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:784) 
    at notdefault.ServerStuffs.vote(ServerStuffs.java:72) 
    at notdefault.MainClass.actionPerformed(MainClass.java:105) 
    at javax.swing.AbstractButton.fireActionPerformed(Unknown Source) 
    at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source) 
    at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source) 
    at javax.swing.DefaultButtonModel.setPressed(Unknown Source) 
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source) 
    at java.awt.Component.processMouseEvent(Unknown Source) 
    at javax.swing.JComponent.processMouseEvent(Unknown Source) 
    at java.awt.Component.processEvent(Unknown Source) 
    at java.awt.Container.processEvent(Unknown Source) 
    at java.awt.Component.dispatchEventImpl(Unknown Source) 
    at java.awt.Container.dispatchEventImpl(Unknown Source) 
    at java.awt.Component.dispatchEvent(Unknown Source) 
    at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source) 
    at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source) 
    at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source) 
    at java.awt.Container.dispatchEventImpl(Unknown Source) 
    at java.awt.Window.dispatchEventImpl(Unknown Source) 
    at java.awt.Component.dispatchEvent(Unknown Source) 
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source) 
    at java.awt.EventQueue.access$400(Unknown Source) 
    at java.awt.EventQueue$2.run(Unknown Source) 
    at java.awt.EventQueue$2.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source) 
    at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source) 
    at java.awt.EventQueue$3.run(Unknown Source) 
    at java.awt.EventQueue$3.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source) 
    at java.awt.EventQueue.dispatchEvent(Unknown Source) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
    at java.awt.EventDispatchThread.run(Unknown Source) 
java.net.SocketTimeoutException: Read timed out 
    at java.net.SocketInputStream.socketRead0(Native Method) 
    at java.net.SocketInputStream.read(Unknown Source) 
    at org.apache.http.impl.io.AbstractSessionInputBuffer.fillBuffer(AbstractSessionInputBuffer.java:166) 
    at org.apache.http.impl.io.SocketInputBuffer.fillBuffer(SocketInputBuffer.java:90) 
    at org.apache.http.impl.io.AbstractSessionInputBuffer.readLine(AbstractSessionInputBuffer.java:281) 
    at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:92) 
    at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:62) 
    at org.apache.http.impl.io.AbstractMessageParser.parse(AbstractMessageParser.java:254) 
    at org.apache.http.impl.AbstractHttpClientConnection.receiveResponseHeader(AbstractHttpClientConnection.java:289) 
    at org.apache.http.impl.conn.DefaultClientConnection.receiveResponseHeader(DefaultClientConnection.java:252) 
    at org.apache.http.impl.conn.ManagedClientConnectionImpl.receiveResponseHeader(ManagedClientConnectionImpl.java:191) 
    at org.apache.http.protocol.HttpRequestExecutor.doReceiveResponse(HttpRequestExecutor.java:300) 
    at org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:127) 
    at org.apache.http.impl.client.DefaultRequestDirector.tryExecute(DefaultRequestDirector.java:715) 
    at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:520) 
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:906) 
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:805) 
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:784) 
    at notdefault.ServerStuffs.vote(ServerStuffs.java:72) 
    at notdefault.MainClass.actionPerformed(MainClass.java:105) 
    at javax.swing.AbstractButton.fireActionPerformed(Unknown Source) 
    at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source) 
    at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source) 
    at javax.swing.DefaultButtonModel.setPressed(Unknown Source) 
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source) 
    at java.awt.Component.processMouseEvent(Unknown Source) 
    at javax.swing.JComponent.processMouseEvent(Unknown Source) 
    at java.awt.Component.processEvent(Unknown Source) 
    at java.awt.Container.processEvent(Unknown Source) 
    at java.awt.Component.dispatchEventImpl(Unknown Source) 
    at java.awt.Container.dispatchEventImpl(Unknown Source) 
    at java.awt.Component.dispatchEvent(Unknown Source) 
    at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source) 
    at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source) 
    at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source) 
    at java.awt.Container.dispatchEventImpl(Unknown Source) 
    at java.awt.Window.dispatchEventImpl(Unknown Source) 
    at java.awt.Component.dispatchEvent(Unknown Source) 
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source) 
    at java.awt.EventQueue.access$400(Unknown Source) 
    at java.awt.EventQueue$2.run(Unknown Source) 
    at java.awt.EventQueue$2.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source) 
    at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source) 
    at java.awt.EventQueue$3.run(Unknown Source) 
    at java.awt.EventQueue$3.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source) 
    at java.awt.EventQueue.dispatchEvent(Unknown Source) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
    at java.awt.EventDispatchThread.run(Unknown Source) 
+1

Wenn Sie ein Lese-Timeout setzen und ein Lese-Timeout erhalten und Sie kein Lese-Timeout wünschen, erhöhen Sie das Lese-Timeout. Es passiert nur, weil du darum gebeten hast. Wenn Sie der Meinung sind, der Server sollte schneller sein als er ist, nehmen Sie ihn mit. – EJP

+2

Ich habe versucht, auch die Lesezeit zu erhöhen, aber früher oder später kam ich auf dieses Problem. Eigentlich hatte ich vergessen, die Verbindungen zu schließen, also gewollte Verbindungen aufrecht zu erhalten und Serverressourcen zu verbrauchen. Antwort von @Santosh unten hat mir sehr geholfen. –

Antwort

14

Hier sind einige Hinweise/Anregungen zur Untersuchung

  1. Ich sehe, dass Sie jedes Mal wählen, Sie vote Methode aufrufen, die eine neue HTTP-Verbindung schafft.
  2. Diese könnte ein Problem sein. Ich würde vorschlagen, eine einzige HttpClient Instanz zu verwenden, um auf dem Server zu veröffentlichen. Auf diese Weise werden nicht zu viele Verbindungen von der Clientseite erstellt.
  3. Am Ende von allem muss HttpClient geschlossen werden und daher httpclient.getConnectionManager().shutdown(); aufrufen, um die von den Verbindungen verwendeten Ressourcen freizugeben.
+1

Danke Mann, du hast meinen Tag gemacht. Ich habe die Verbindung zuletzt abgeschaltet und es hat sehr geholfen. –

2

Ich glaube nicht, dass es reicht, um nur die Antwort zu erhalten. Ich denke, Sie müssen es lesen (Holen Sie sich die Entität und lesen Sie es über EntityUtils.consume()).

z.B. (Aus dem doc)

 System.out.println("<< Response: " + response.getStatusLine()); 
    System.out.println(EntityUtils.toString(response.getEntity())); 
+0

Eigentlich habe ich das, ich habe gerade versucht, die Dinge kurz zu machen. Ich werde meine Frage bearbeiten. Vielen Dank. –

Verwandte Themen