私は与えられたURLからすべてのURLを取得したいと思いますし、各URLの状態を確認したいと思います。マルチスレッドの場合、httpurlconnectionが適切な応答コードを提供していません
私はExecutorService
をマルチスレッドで各URLのステータスを確認するために使用しています。
とき、私ドンさて問題はあるURLに対する応答コードを確認し、クラスのコードが
public class ConnectionTester implements Callable<Object> {
private URL url;
private Map<String,Integer> map;
private static final Log LOGGER =
LogFactoryUtil.getLog(ConnectionTester.class);
public ConnectionTester(String url,Map<String,Integer> map) {
try {
this.url = new URL(url);
this.map = map;
} catch (MalformedURLException e) {
LOGGER.error(e.getMessage(), e);
}
}
/**
* Get status code of url
* @return
*/
public void getStatuscode(URL url) {
HttpURLConnection http = null;
try {
http = (HttpURLConnection)url.openConnection();
http.setConnectTimeout(0);
http.setReadTimeout(0);
http.setRequestMethod("HEAD");
http.setRequestProperty("User-Agent","Mozilla/5.0 (Windows NT 10.0;
Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)
Chrome/56.0.2924.87 Safari/537.36");
http.connect();
map.put(url.toString(), http.getResponseCode());
} catch (IOException e) {
map.put(url.toString(), 500);
}finally{
if(http !=null)http.disconnect();
}
}
@Override
public Object call() throws Exception {
getStatuscode(url);
return null;
}
}
の下に与えられていると私はそれぞれ、すべてのURL
ExecutorService service = Executors.newFixedThreadPool(urls.size());
List<ConnectionTester> connectionTesters = new ArrayList<ConnectionTester>(urls.size());
Map<String,Integer> map = new HashMap<String, Integer>();
for (String string : urls) {
if(Validator.isNotNull(string) && !string.contains("mailto"))
connectionTesters.add(new ConnectionTester(string, map));
}
service.invokeAll(connectionTesters);
のための応答コードを確認するには、次のコードを使用しますマルチスレッドを使用していませんそれぞれのURLの適切な応答コードを取得しますが、マルチスレッドを使用すると接続タイムアウト例外が発生します。
これまでのところ、私は以下のことをチェックして試しました。
- 私のインターネットの速度は、私は無限の時間を設定する
http.setConnectTimeout(0); http.setReadTimeout(0);
を設定している - 高いです。
- 私がチェックしているURLの応答時間も少なく、正常です。
私はここで何が欠けていますか?
サーバーをオーバーロードしています。解決策:しないでください。 – EJP
また、あなたのメソッド 'getStatuscode(URL url)'には影があります。属性 'url'もクラスに対して定義されています。 –
おそらく多くのURLが同じサーバー用であるため、要求を拒否している可能性があります。また、X接続の標準的な制限に組み込まれている同じドメインにアクセスすることもできます。 – john16384