2010-06-10 41 views
10

Tôi phải triển khai ứng dụng khách webservice đến tệp WSDL đã cho. Tôi đã sử dụng công cụ 'wsimport' của SDK để tạo các lớp Java từ WSDL cũng như một lớp bọc phương thức duy nhất của webservice (enhanceAddress(auth, param, address)) vào một phương thức java đơn giản. Càng xa càng tốt. Webservice có chức năng và trả về kết quả đúng đắn. Mã này trông như thế này:Chi tiết kết nối & thời gian chờ trong ứng dụng khách dịch vụ web java

try { 
    EnhancedAddressList uniservResponse = getWebservicePort().enhanceAddress(m_auth, m_param, uniservAddress); 
    //Where the Port^ is the HTTP Soap 1.2 Endpoint 
}catch (Throwable e) { 
    throw new AddressValidationException("Error during uniserv webservice request.", e); 
} 

Vấn đề bây giờ là: tôi cần để có được thông tin về các kết nối và bất kỳ lỗi có thể xảy ra để cư giá trị JMX khác nhau (chẳng hạn như COUNT_READ_TIMEOUT, COUNT_CONNECT_TIMEOUT, ...) Thật không may, phương pháp này không chính thức ném bất kỳ Trường hợp ngoại lệ nào, do đó, để có được thông tin chi tiết về ConnectException, tôi cần sử dụng getCause() trên số ClientTransportException sẽ bị loại bỏ.

Thậm chí tệ hơn: tôi đã thử kiểm tra giá trị thời gian chờ đọc, nhưng không có giá trị nào. Tôi đã thay đổi vị trí của dịch vụ trong tệp wsdl để gửi yêu cầu tới một tập lệnh php mà chỉ đơn giản là chờ đợi mãi mãi và không trả lại. Đoán xem: Ứng dụng khách dịch vụ web thực hiện không phải là hết thời gian chờ đợi (tôi đã giết ứng dụng sau 30 phút chờ đợi). Đó không phải là một lựa chọn cho ứng dụng của tôi khi tôi cuối cùng chạy ra khỏi các kết nối tcp nếu một số người trong số họ bị 'kẹt'.

Phương thức enhanceAddress(auth, param, address) không được triển khai nhưng được chú thích bằng javax.jws. * Chú thích, có nghĩa là tôi không thể xem/thay đổi/kiểm tra mã thực sự được thực thi.

Tôi có tùy chọn nào khác ngoài việc vứt bỏ toàn bộ công cụ wsimport/javax.jsw và thực hiện ứng dụng khách xà phòng của riêng mình?

Trả lời

14

để thiết lập read-timeout và kết nối timeout bạn có thể cấu hình các thông số ràng buộc khi bạn thiết lập dịch vụ và Cảng của bạn ví dụ:


Service = new Service(); 

    Port = Service.getPort(); 

    ((BindingProvider) Port).getRequestContext().put(
      BindingProvider.ENDPOINT_ADDRESS_PROPERTY, 
      "http://localhost:8080/service"); 
    ((BindingProvider) Port).getRequestContext().put(
      BindingProviderProperties.CONNECT_TIMEOUT, 
      30); 
    ((BindingProvider) Port).getRequestContext().put(
      BindingProviderProperties.REQUEST_TIMEOUT, 
      30); 

tại bất cứ khi nào bạn thực hiện một dịch vụ thông qua "Port" bạn sẽ nhận được thời gian chờ phản hồi và/hoặc thời gian chờ kết nối nếu chương trình phụ trợ chậm phản hồi. các giá trị theo các giá trị thời gian chờ của Lớp Socket.

khi hết thời gian chờ này, bạn sẽ bị mất thời gian chờ hoặc ngoại lệ kết nối và bạn có thể đặt mã ngược để theo dõi số lượng bạn nhận được.

+0

Vì tôi đã có Vấn đề 2 tuần trước, tôi đã viết ứng dụng khách của riêng mình. Mặc dù vậy, tôi đã thử nghiệm cách tiếp cận của bạn và nó đang hoạt động! Tôi đã tìm thấy một đoạn mã tương tự trước đó, nhưng bằng cách nào đó nó đã cho tôi một ClassCastException khi tôi cố gắng để đúc để BindingProvider. – f1sh

+0

Tôi có một vấn đề tương tự, NHƯNG thời gian chờ xảy ra khi tôi nhận được cổng, làm thế nào để giải quyết nó ?? – maugch

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