Ich versuche, eine lange Polling Push-Service auf meiner Android-Anwendung zu implementieren (basierend auf Microsofts AUTD ActiveSync ->http://technet.microsoft.com/en-us/library/aa997252.aspx).Android https lange Polling: Kann keine Antwort erhalten, wenn Polling-Intervall länger als 70 Sekunden ist
Ich habe bereits den Server Teil mit Servlets 3.0 auf Tomcat 7.0 realisiert. Ich habe meine AsyncServlets mit CURL getestet, alles funktioniert einwandfrei.
Das ist, wie ich meine AsyncServlet getestet:
curl "https://webservice.mydomain.net/push?id=1&heartbeat=180000" --insecure --user user:password -D -
Server-Antwort nach 3 Minuten (Taktintervall)
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Pragma: No-cache
Cache-Control: no-cache
Expires: Thu, 01 Jan 1970 01:00:00 CET
Content-Type: application/json;charset=ISO-8859-1
Content-Length: 0
Date: Sat, 15 Jan 2011 23:38:57 GMT
auf meinem Android-Anwendung habe ich folgenden Code:
HttpParams httpParams = mDefaultHttpClient.getParams();
HttpConnectionParams.setConnectionTimeout(httpParams, CONNECTION_TIMEOUT);
HttpConnectionParams.setSoTimeout(httpParams, mHeartbeat + TIMEOUT_TOLERANCE);
mDefaultHttpClient.setParams(httpParams);
HttpGet httpGet = new HttpGet(mPushURL);
httpGet.addHeader("Accept", "application/json");
try {
Log.i(TAG, "Executing GET(PUSH) request " + httpGet.getRequestLine());
HttpResponse httpResponse = mDefaultHttpClient.execute(httpGet);
Log.i(TAG, httpResponse.getStatusLine().toString());
Log.i(TAG, convertInputStream(httpResponse.getEntity().getContent())); //For testing purposes
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
Ich habe mehrere Tests durchgeführt. Wenn ich ein Herzschlagintervall von 70 Sekunden verwende, erhalte ich die Antwort. Wenn ich ein Heartbeat-Intervall> 70 Sekunden verwende, erhalte ich (nach dem angegebenen Heartbeat-Intervall) eine SocketTimeoutException anstelle meiner HTTP 200 OK Response. (Zur Verdeutlichung: Mein Set SocketTimeout (SoTimeout) funktioniert korrekt, aber vielleicht ist die Verbindung verloren, ich habe keine Ahnung warum).
Danke für jede Antwort.