定期的にポーリングし、特定の応答に基づいてメッセージを送信するサーバー用のJavaクライアントをセットアップしています。クラスで使用した戦略は次のとおりです。
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で解決策を見つけることができませんでした。私はコンテンツを消費HttpPost
し、sendメソッドで新しいオブジェクトを作成しようとしましたが、これまでのところ何も役に立ちませんでした。
このような状況に適した戦略は何ですか。私は現在、問題が発生した場合に備えて、オブジェクトにkeep-alive
ヘッダーを設定しています。HttpPost
それ以外は何もしていないと思います。これは戦略全体と関係があると思います。接続ごとに新しいオブジェクトを作成したくはありませんが、どのレベルの再利用が推奨されているかもわかりません。助けてくれてありがとう。ああ..これはHttpClient4.2.2です