2012-03-02 30 views
11

Tôi đang sử dụng API javax.xml.soap (javax.xml.soap.SOAPConnectionFactory, javax.xml.soap.SOAPConnection và bạn bè) để thực hiện cuộc gọi dịch vụ web đến máy chủ từ xa.Cài đặt thời gian chờ đọc socket bằng javax.xml.soap.SOAPConnection

Tuy nhiên, đôi khi có sự cố và chương trình bị kẹt vĩnh viễn.

Để giải quyết vấn đề này, tôi muốn thêm thời gian chờ đã đọc.

Tôi đã tìm thấy một số cách có thể đạt được điều này, nhưng tất cả đều có vẻ khá tệ.

Vì vậy, câu hỏi của tôi đối với cộng đồng là: Cách tốt nhất để thực hiện hành vi hết thời gian chờ khi sử dụng API javax.xml.soap để thực hiện cuộc gọi là gì?

+0

Xin chào Samuel Vui lòng xem xét câu hỏi bên dưới vì nó hơi giống với ngữ cảnh giống như câu hỏi của bạn. Hy vọng bạn sẽ có thể đề xuất điều gì đó tại đây https://stackoverflow.com/questions/47861767/http-connect-timeout-and-read-timeout-for-urlstreamhandler-with-saaj-working-fo –

Trả lời

26

Bạn phải tạo riêng của bạn URLStreamHandler để bạn có thể thiết lập các thông số như URLConnection thời gian chờ kết nối và đọc thời gian chờ.

SOAPConnection connection = SOAPConnectionFactory.newInstance().createConnection(); 
URL endpoint = 
    new URL(new URL("http://yourserver.yourdomain.com/"), 
      "/path/to/webservice", 
      new URLStreamHandler() { 
      @Override 
      protected URLConnection openConnection(URL url) throws IOException { 
       URL target = new URL(url.toString()); 
       URLConnection connection = target.openConnection(); 
       // Connection settings 
       connection.setConnectTimeout(10000); // 10 sec 
       connection.setReadTimeout(60000); // 1 min 
       return(connection); 
      } 
      }); 

SOAPMessage result = connection.call(soapMessage, endpoint); 

Tôi đã xóa một số thử/nắm bắt để rõ ràng.

+0

Bạn có đang chuyển đổi URL được chuyển sang openConnection thành Chuỗi và quay lại để ngăn target.openConnection sử dụng URLStreamHandler đang được xác định không? –

+0

Đó là một điểm tốt. Tôi đã không thử nghiệm bản thân mình, nhưng tôi nghĩ rằng bạn đoán đúng: đệ quy vô hạn được đóng lại;) Thành thật mà nói, tôi nhận được mã đó từ đây: http://stackoverflow.com/questions/2148915/how-do-i-set- time-for-a-jax-ws-webservice-client –

+0

Thật buồn cười, tôi nghĩ rằng tôi đã thấy câu hỏi đó nhưng không nhìn vào câu trả lời vì đó là một vấn đề khác (tôi không nghĩ rằng câu trả lời thực sự là địa chỉ) . –

2
import com.sun.xml.internal.ws.client.BindingProviderProperties 

public someResponse callWebService() { 

    MyPort port = new Service().getPort(); 

    Map<String, Object> requestContext = ((BindingProvider) port).getRequestContext(); 

    requestContext.put(BindingProviderProperties.CONNECT_TIMEOUT, 10 * 1000); //10 secs 

    requestContext.put(BindingProviderProperties.REQUEST_TIMEOUT, 1 * 60 * 1000); //1 min 

    return port.someWebMethod(); 

} 
+0

Thế nào là 'Dịch vụ'? Tôi nghĩ bạn có thể trả lời một câu hỏi khác với câu hỏi của tôi. –

+0

Đoạn mã này tương ứng với việc sử dụng các chú thích JAX-WS để có được một cổng dịch vụ tới một dịch vụ web thông qua WSDL –

+0

của nó thực sự hữu ích. –

Các vấn đề liên quan