私は定期的にポーリングを行い、特定の応答に基づいてメッセージを送信するサーバー用のJavaクライアントを設定します。クラスに使用した戦略は次のとおりです。Apache HttpClientサーバー戦略への複数のポーリング接続
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();
}
}
}
私は約3秒でポーリングを行うスレッドを開始します。ポーリング結果に基づいてメインスレッドからメッセージを送信できます。コードは機能しますが、次の2つの例外を与え続けますが、その間に作業を続けます。
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.
私はただ例外をミュートすることができますが、何が起こっているのか知りたいと思います。私はGoogle経由で解決策を見つけることができませんでした。私はコンテンツを消費しようとしましたが、sendメソッドで新しいHttpPost
オブジェクトを作成しました。そのようなものですが、これまで何も助けてくれませんでした。
このような状況に適した戦略は何ですか?現時点ではHttpPost
オブジェクトにkeep-alive
ヘッダーを設定しています。それ以外には、私は何もしていないと思う。私はこれが全体的な戦略と関係していると思います。私はすべての接続のために新しいオブジェクトを作りたいとは思っていませんが、どのレベルの再利用が推奨されるかもわかりません。助けてくれてありがとう。ああ..これはHttpClientです。4.2.2