2009-12-03 3 views
6

tôi sử dụng đoạn mã Groovy sau để có được những đại diện đồng bằng văn bản của một trang HTML trong một ứng dụng Grails:.Setting timeout cho URL mới (...) văn bản trong Groovy/Grails

String str = new URL("http://www.example.com/some/path")?.text?.decodeHTML() 

Bây giờ Tôi muốn thay đổi mã để yêu cầu sẽ hết thời gian chờ sau 5 giây (kết quả là str == null). Cách dễ nhất và hấp dẫn nhất để đạt được điều đó là gì?

Trả lời

6

Bạn sẽ phải làm điều đó theo cách cũ, nhận được một URLConnection, thiết lập thời gian chờ trên đối tượng đó, sau đó đọc trong các dữ liệu thông qua một Reader

Đây sẽ là một điều tốt để thêm vào Groovy dù (imho), vì đó là điều tôi có thể thấy bản thân mình cần tại một số điểm ;-)

Có thể đề xuất nó như là một yêu cầu tính năng trên JIRA?

Tôi đã thêm nó như là một RFE trên Groovy JIRA

http://jira.codehaus.org/browse/GROOVY-3921

Vì vậy, hy vọng chúng ta sẽ thấy nó trong một phiên bản tương lai của Groovy ...

+0

+1: Rất đẹp! Và với một bản vá: http://jira.codehaus.org/secure/attachment/46210/URL.text-timout.patch – knorv

+0

Ước gì tôi có thể nghĩ ra một cách thử nghiệm (mặc dù không yêu cầu máy thử nghiệm phải có kết nối internet) , và nếu không có búa một số trang web nghèo mỗi khi ai đó chạy thử nghiệm) ;-) –

+1

Chỉ là một bản cập nhật, nó đã được phát hành trong Groovy. trả lại URL mới (url) .getText ([connectTimeout: 500, readTimeout: 5000]); – Ben

4

Tôi đã kiểm tra mã nguồn của groovy 2.1.8, bên dưới mã có sẵn:

String text = 'http://www.google.com'.toURL().getText([connectTimeout: 2000, readTimeout: 3000]) 

Logic để xử lý bản đồ cấu hình nằm trong phương pháp org.codehaus.groovy.runtime.ResourceGroovyMethods#configuredInputStream

private static InputStream configuredInputStream(Map parameters, URL url) throws IOException { 
    final URLConnection connection = url.openConnection(); 
    if (parameters != null) { 
     if (parameters.containsKey("connectTimeout")) { 
      connection.setConnectTimeout(DefaultGroovyMethods.asType(parameters.get("connectTimeout"), Integer.class)); 
     } 
     if (parameters.containsKey("readTimeout")) { 
      connection.setReadTimeout(DefaultGroovyMethods.asType(parameters.get("readTimeout"), Integer.class)); 
     } 
     if (parameters.containsKey("useCaches")) { 
      connection.setUseCaches(DefaultGroovyMethods.asType(parameters.get("useCaches"), Boolean.class)); 
     } 
     if (parameters.containsKey("allowUserInteraction")) { 
      connection.setAllowUserInteraction(DefaultGroovyMethods.asType(parameters.get("allowUserInteraction"), Boolean.class)); 
     } 
     if (parameters.containsKey("requestProperties")) { 
      @SuppressWarnings("unchecked") 
      Map<String, String> properties = (Map<String, String>) parameters.get("requestProperties"); 
      for (Map.Entry<String, String> entry : properties.entrySet()) { 
       connection.setRequestProperty(entry.getKey(), entry.getValue()); 
      } 
     } 

    } 
    return connection.getInputStream(); 
}