2017-03-17 26 views
0

私は与えられた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の適切な応答コードを取得しますが、マルチスレッドを使用すると接続タイムアウト例外が発生します。

これまでのところ、私は以下のことをチェックして試しました。

  1. 私のインターネットの速度は、私は無限の時間を設定するhttp.setConnectTimeout(0); http.setReadTimeout(0);を設定している
  2. 高いです。
  3. 私がチェックしているURLの応答時間も少なく、正常です。

私はここで何が欠けていますか?

+0

サーバーをオーバーロードしています。解決策:しないでください。 – EJP

+0

また、あなたのメソッド 'getStatuscode(URL url)'には影があります。属性 'url'もクラスに対して定義されています。 –

+0

おそらく多くのURLが同じサーバー用であるため、要求を拒否している可能性があります。また、X接続の標準的な制限に組み込まれている同じドメインにアクセスすることもできます。 – john16384

答えて

1

サーバーをオーバーロードしています。 Unix/Linux TCPサーバのlisten(2)バックログキューが満杯になると、着信接続要求が無視され始め、クライアントで接続タイムアウトが発生します。

解決策:しないでください。スレッド数を減らし、スレッドに接続タイムアウトが発生した場合は、それ以上作成しないでください。

+0

あなたは正しいかもしれませんが、最小時間内にもっと多くのURLのステータスをチェックすることは可能でしょうか? 。私はマルチスレッド以外の方法は見ません。 – Kanan

+1

これは、バックログ・キューの動作方法です。これは、すでに述べたように、サーバーを過負荷にする方法ではありません。あなたの「最小」という考えがエラーの原因になる場合、「最小時間」は意味を持ちません。あなたはサーバーがあなたにできるより速く行くことはできません。 – EJP

関連する問題