2014-02-24 2 views
0

ARIN rest whois 서비스를 사용하여 IP 주소 목록에 대한 조직을 찾습니다. 목록이 매우 길기 때문에 (아래의 내용은 매우 작은 부분 집합 임), 스레드를 사용하여 성능을 향상시키기 위해이 작업을 수행하기로했습니다. 45 + 주위에스레드에서 이상한 http 시간 초과 오류가 발생했습니다.

내 작업 기계에
public class WorkerThread implements Runnable { 

    private String workingIP; 

    public WorkerThread(String workingIP) { 
     this.workingIP = workingIP; 
    } 


    @Override 
    public void run() { 
     try { 
      URL url = new URL("http://whois.arin.net/rest/ip/" + workingIP); 

      InputStream inputStream = null; 
      HttpURLConnection con = (HttpURLConnection)(url.openConnection()); 
      con.connect(); 
      inputStream = con.getInputStream(); 

      BufferedReader br = new BufferedReader(new InputStreamReader(inputStream, "UTF-8")); 

      String line = null; 
      while((line=br.readLine()) != null) 
      { 
       if (line.contains("<td>Organization</td><td>")) { 
        String companyName = line.replace("<td>Organization</td><td>", "").trim(); 
        System.out.println(workingIP + " maps to: " + companyName); 
        break; 
       } 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

} 

,이 코드는 잘 작동 (AN i5-2400 4GB의 RAM, 32 비트 Win7에가/W) 끝까지 :

public class SimpleThreadPool { 

    public final static String[] ips = { 
     "192.150.16.64","192.243.232.36","208.77.139.8","63.140.35.160", 
     "63.140.35.161","63.140.35.162","63.140.59.142","63.140.61.200", 
     "66.235.132.238","66.235.137.133","66.235.138.18","66.235.138.192", 
     "66.235.138.195","66.235.139.152","66.235.139.172","66.235.139.204", 
     "66.235.139.205","66.235.139.206","66.235.139.227","66.235.141.144", 
     "66.235.141.145","66.235.141.146","66.235.141.16","66.235.142.20", 
     "66.235.142.24","66.235.141.145","184.106.60.35","207.171.162.26", 
     "207.171.162.75","207.171.162.95","207.171.185.201","207.171.187.117", 
     "207.171.187.118","207.171.189.80","207.171.189.81","216.137.37.108", 
     "216.137.37.122","216.137.37.128","216.137.37.138","216.137.37.140", 
     "216.137.37.178","216.137.37.183","216.137.37.198","216.137.37.225", 
     "216.137.37.235","216.137.37.37","216.137.37.52","216.137.37.57", 
     "216.137.37.6","216.137.37.84" 
    }; 

    public static void main(String[] args) throws InterruptedException { 
     ExecutorService executor = Executors.newFixedThreadPool(4); 

     for (int i = 0; i < ips.length; i++) { 
      Runnable worker = new WorkerThread(ips[i]); 
      executor.execute(worker); 
     } 

     executor.shutdown(); 

     while (!executor.isTerminated()) {} 

     System.out.println("All threads finished."); 
    } 
} 

그리고 여기가의 WorkerThread입니다 어레이의 IP 주소. 그럼 난 나머지 조회에 던져 java.net.ConnectException 오류를 얻을 : 나는 1 집행자의 스레드 풀 크기를 변경하는 경우

... 
216.137.37.57 maps to: Amazon.com, Inc. 
216.137.37.6 maps to: Amazon.com, Inc. 
java.net.ConnectException: Connection timed out: connect 
     at java.net.PlainSocketImpl.socketConnect(Native Method) 
     at java.net.PlainSocketImpl.doConnect(Unknown Source) 
     at java.net.PlainSocketImpl.connectToAddress(Unknown Source) 
     at java.net.PlainSocketImpl.connect(Unknown Source) 
     at java.net.SocksSocketImpl.connect(Unknown Source) 
     at java.net.Socket.connect(Unknown Source) 
     at java.net.Socket.connect(Unknown Source) 
     at sun.net.NetworkClient.doConnect(Unknown Source) 
     at sun.net.www.http.HttpClient.openServer(Unknown Source) 
     at sun.net.www.http.HttpClient.openServer(Unknown Source) 
     at sun.net.www.http.HttpClient.<init>(Unknown Source) 
     at sun.net.www.http.HttpClient.New(Unknown Source) 
     at sun.net.www.http.HttpClient.New(Unknown Source) 
     at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(Unknown Source) 
     at sun.net.www.protocol.http.HttpURLConnection.plainConnect(Unknown Source) 
     at sun.net.www.protocol.http.HttpURLConnection.connect(Unknown Source) 

을하고 모든 작업 및 오류가 발생하지 않습니다,하지만 분명히 조회는 훨씬 더 오래 걸릴.

정말 이상한 점은 내 2011 Core i7 Mac에서이 코드를 실행해도 아무런 오류가 발생하지 않는다는 것입니다. 두 네트워크는 서로 다른 네트워크에 있습니다 (내 작업 시스템은 내 작업 네트워크를 사용하고 Mac은 무선으로 스마트 폰에 연결됨).

여기에 무슨 일이 일어나고 있는지, 그리고 해결할 수있는 방법이 있습니까?

답변

0

정상적인 오류 처리 코드를 작성해야합니다. 정말 간단합니다. 연결 시간이 초과되면 어떻게하고 싶습니까? 느린 네트워크에서 한 번에 많은 연결을하면 그 중 일부는 시간이 초과 될 수 있습니다.

+0

위의 catch 문이 이상적이지 않다는 것에 동의합니다. 문제의 성격을 설명하기 위해 실제로 존재합니다 (오류 처리는 완성 된 앱에서 더욱 강력합니다). 문제는 느린 네트워크가 아닙니다 (내 작업 연결은 @ 25 + Mb/s 다운입니다). 나는 이러한 예외를 잡아서 요청을 다시 시도하려고 시도 할 수 있습니다.하지만이 오류가 결코 발생하지 않는 단일 스레드 솔루션을 계속 사용하는 것이 좋을 것입니다. 왜냐하면 훨씬 긴 목록에서 더 빠를 가능성이 높기 때문입니다. – benjammin

+0

@Brutalisk 멀티 스레드 솔루션은 더 긴 목록에 대해 훨씬 빠릅니다. 연결 오류가 발생하기 시작하면 허겁지겁 걸으십시오. –

관련 문제