をキャッシュしているようです。私は要求を処理するためにマルチスレッドHttpClientベースのクラスを構築しました。私はExecutorService
を使ってスレッドプールを作ってスレッドを実行しています。問題は、動的属性が各リクエストで変更されないことがあり、3つまたは4つの後続スレッドで同じ値を取得することになります。私はHttpClientについて多くのことを読んできました。この問題の原因がわかりません。それはキャッシングについての何かか、それとも何かのようなものでしょうか?のJavaのHttpClientは、私はシンプルなウェブスクレイパーを構築していると私は同じページに数百回をフェッチする必要があり、動的であり、それぞれの要求に応じて変更する必要がありますページ内の属性がありますコンテンツ
更新:ここで、各スレッドで実行されるコードです:
HttpContext localContext = new BasicHttpContext();
HttpParams params = new BasicHttpParams();
HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
HttpProtocolParams.setContentCharset(params,
HTTP.DEFAULT_CONTENT_CHARSET);
HttpProtocolParams.setUseExpectContinue(params, true);
ClientConnectionManager connman = new ThreadSafeClientConnManager();
DefaultHttpClient httpclient = new DefaultHttpClient(connman, params);
HttpHost proxy = new HttpHost(inc_proxy, Integer.valueOf(inc_port));
httpclient.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY,
proxy);
HttpGet httpGet = new HttpGet(url);
httpGet.setHeader("User-Agent",
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)");
String iden = null;
int timeoutConnection = 10000;
HttpConnectionParams.setConnectionTimeout(httpGet.getParams(),
timeoutConnection);
try {
HttpResponse response = httpclient.execute(httpGet, localContext);
HttpEntity entity = response.getEntity();
if (entity != null) {
InputStream instream = entity.getContent();
String result = convertStreamToString(instream);
// System.out.printf("Resultado\n %s",result +"\n");
instream.close();
iden = StringUtils
.substringBetween(result,
"<input name=\"iden\" value=\"",
"\" type=\"hidden\"/>");
System.out.printf("IDEN:%s\n", iden);
EntityUtils.consume(entity);
}
}
catch (ClientProtocolException e) {
// TODO Auto-generated catch block
System.out.println("Excepção CP");
} catch (IOException e) {
// TODO Auto-generated catch block
System.out.println("Excepção IO");
}
サーバー側にキャッシュできます。 – PeterMmm
スレッドセーフでないコードを書くことができます。データをダウンロードするたびに古い結果が新しい結果で上書きされます。コードなしで伝えるのは難しいです。 –
コード – Trota