Ich richte einen Java-Client für einen Server ein, den ich regelmäßig abrufe und Meldungen basierend auf einer bestimmten Antwort sende. Die Strategie, die ich für die Klasse verwendet habe, lautet wie folgt:Apache HttpClient Mehrere Polling-Verbindungen zur Server-Strategie
public class PollingClient {
private HttpClient client = getHttpClient(); // I get a DefaultHttpClient this way so it's easier to add connection manager and strategy etc to the client later
private HttpPost httpPost = getHttpPost(); // same idea, I set headers there
public String poll() {
List<NameValuePair> formparams = new ArrayList<NameValuePair>();
formparams.add(new BasicNameValuePair("id", someId));
String responseString = null;
try {
UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(formparams, "UTF-8");
httppost.setURI(polluri));
httppost.setEntity(formEntity);
HttpResponse response = httpclient.execute(httppost);
HttpEntity entity = response.getEntity();
if (entity != null) {
responseString = EntityUtils.toString(entity);
}
EntityUtils.consume(entity);
} catch (Exception e) {
e.printStackTrace();
}
}
public void send(String msg) {
List<NameValuePair> formparams = new ArrayList<NameValuePair>();
formparams.add(new BasicNameValuePair("msg", msg));
formparams.add(new BasicNameValuePair("id", someId));
String responseString = null;
try {
UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(formparams, "UTF-8");
httppost.setURI(new URI(URL + "send"));
httppost.setEntity(formEntity);
HttpResponse response = httpclient.execute(httppost);
HttpEntity entity = response.getEntity();
if (entity != null) {
responseString = EntityUtils.toString(entity);
}
EntityUtils.consume(entity);
} catch (Exception e) {
e.printStackTrace();
}
}
}
Ich starte einen Thread, der die Abfrage nach etwa 3 Sekunden abarbeitet. Ich kann die Nachrichten vom Hauptthread basierend auf den Umfrageergebnissen senden. Der Code funktioniert, gibt mir aber weiterhin die folgenden zwei Ausnahmen, arbeitet aber dazwischen weiter.
java.lang.IllegalStateException: Invalid use of BasicClientConnManager: connection still allocated.
Make sure to release the connection before allocating another one.
org.apache.http.NoHttpResponseException: The target server failed to respond.
Ich könnte nur die Ausnahmen stummschalten, aber ich möchte wissen, was vor sich geht. Ich konnte keine Lösungen über Google finden. Ich habe versucht, Inhalt zu konsumieren, ein neues HttpPost
-Objekt in der Sendemethode zu machen, so etwas, aber nichts hat bisher geholfen.
Was ist eine gute Strategie für eine Situation wie diese. Ich setze derzeit den keep-alive
Header im HttpPost
Objekt, falls das wichtig ist. Ansonsten glaube ich nicht, dass ich irgendetwas mache. Ich denke, das hat mit der Strategie insgesamt zu tun. Ich möchte nicht für jede Verbindung ein neues Objekt erstellen, aber ich weiß auch nicht, welche Stufe der Wiederverwendung empfohlen wird. Danke für jede Hilfe. Oh .. und das ist HttpClient 4.2.2