2012-03-29 19 views
16

Tôi có một chương trình sử dụng javax.xml.ws.Service để gọi một dịch vụ từ xa được xác định bởi WSDL. Chương trình này chạy trên Google App Engine, theo mặc định, đặt thời gian chờ kết nối HTTP là 5 giây {1}. Tôi cần tăng giá trị thời gian chờ vì dịch vụ này thường mất nhiều thời gian để phản hồi nhưng vì yêu cầu này không được thực hiện với URLConnection, tôi không thể tìm ra cách gọi URLConnection.setReadTimeout(int) {2} hoặc thay đổi thời gian chờ.Tôi có thể đặt toàn bộ thời gian chờ của kết nối HTTP không?

Có cách nào để đặt toàn bộ thời gian chờ kết nối HTTP trên Máy ứng dụng không? Và, với mục đích chia sẻ kiến ​​thức, làm cách nào để giải quyết vấn đề này nói chung?

{1}: https://developers.google.com/appengine/docs/java/urlfetch/overview#Requests

{2}: http://docs.oracle.com/javase/1.5.0/docs/api/java/net/URLConnection.html#setReadTimeout(int)

Trả lời

4

Xem https://developers.google.com/appengine/docs/java/urlfetch/usingjavanet

Bạn có thể làm một cái gì đó như thế này để có được một URLConnection:

URL url = new URL("http://www.example.com/atom.xml"); 
    URLConnection tempConnection = url.openConnection(); 
    tempConnection.setReadTimeout(10); 
+0

Toàn bộ vấn đề là đối tượng 'URLConnection' không bao giờ có sẵn cho tôi. Yêu cầu được thực hiện theo cách mờ đục sử dụng 'javax.xml.ws.Service' –

8

Hãy thử điều này:

Port port = service.getPort(endPointInterface); //or another "getPort(...)" 
((BindingProvider) port).getRequestContext() 
    .put(BindingProviderProperties.REQUEST_TIMEOUT, 30); 
+0

Tôi chưa thử điều này, nhưng bạn nhận được tiền thưởng để cung cấp câu trả lời mà tôi chưa thấy ở bất kỳ nơi nào khác. –

12

Bạn có thể thử đặt các thuộc tính hệ thống sun.net.client.defaultConnectTimeoutsun.net.client.defaultReadTimeout được ghi lại here, ví dụ:

System.setProperty("sun.net.client.defaultReadTimeout", "30000"); 
System.setProperty("sun.net.client.defaultConnectTimeout", "30000"); 

EDIT

Xin lỗi, chỉ cần đọc lại và nhận thấy đây là trên Google App Engine. Tôi không biết chắc chắn, nhưng với mối quan hệ tôn trọng Google và Oracle gần đây, tôi đoán GAE không chạy Oracle JVM. Tôi sẽ để điều này ở đây trong trường hợp người khác gặp phải vấn đề tương tự.

+0

Liên kết tới tài liệu: http://docs.oracle.com/javase/6/docs/technotes/guides/net/properties.html –

1

Đối với Máy ứng dụng với JAX-WS, bạn phải đặt bối cảnh yêu cầu (được kiểm tra hôm nay với SDK 1.9.15). Đối với các máy bình thường, bạn không thể đi cao hơn 60 và sẽ phải chuyển sang các máy lớn hơn (Bx) để sử dụng tốt hơn một hàng đợi công việc.

Để thử nghiệm cục bộ, bạn thường sử dụng BindingProviderProperties.CONNECT_TIMEOUT và BindingProviderProperties.REQUEST_TIMEOUT, nhưng chúng không nằm trong Danh sách trắng JRE của Máy ứng dụng và kiểm tra mã của bạn có thể liên tục cảnh báo bạn về điều đó. Các chuỗi tương đương có thể được sử dụng mặc dù:

com.sun.xml.internal.ws.connect.timeout 
com.sun.xml.internal.ws.connect.timeout 

Đối với việc triển khai App Engine:

com.sun.xml.ws.connect.timeout 
com.sun.xml.ws.request.timeout 

Một ví dụ đầy đủ làm thế nào để áp dụng mà mã tự động tạo ra từ JAX-WS 2.x, giá trị phải được cung cấp theo mili giây:

@WebEndpoint(name = "Your.RandomServicePort") 
public YourServiceInterface getYourRandomServicePort() { 
    YourRandomServiceInterface port = super.getPort(YOURRANDOMSERVICE_QNAME_PORT, YourRandomServiceInterface.class); 
    Map<String, Object> requestContext = ((BindingProvider)port).getRequestContext(); 
    requestContext.put("com.sun.xml.ws.connect.timeout", 10000); 
    requestContext.put("com.sun.xml.ws.request.timeout", 10000); 
    return port; 
}