2010-06-28 31 views
12

Tôi gặp sự cố khi đặt thời gian chờ jax-ws. Mã của tôi là:Cài đặt thời gian chờ của ứng dụng khách jax-ws

@WebServiceClient(name = "VoipDBJDBCService", targetNamespace = "http://db.server.voipmeter.jextreme.eu/", wsdlLocation = "http://trace0.nyc.blinkmind.com:8080/voipdb?wsdl") 
public class VoipDBJDBCService extends Service { 
    public VoipDBJDBCService(URL wsdlLocation) { 
     super(wsdlLocation, new QName("http://db.server.voipmeter.jextreme.eu/", "VoipDBJDBCService")); 
    } 

    @WebEndpoint(name = "VoipDBJDBCPort") 
    public VoipDB getVoipDBJDBCPort() { 
     return super.getPort(new QName("http://db.server.voipmeter.jextreme.eu/", "VoipDBJDBCPort"), VoipDB.class); 
    } 
} 

Và việc sử dụng:

VoipDB db = new VoipDBJDBCService(new URL(url)).getVoipDBJDBCPort(); 

Làm thế nào để tôi Hook trong timeouts? Tôi đã tìm thấy "giải pháp" ở đây: https://jax-ws.dev.java.net/guide/HTTP_Timeouts.html nhưng tôi không biết nơi tôi sẽ móc nó vào. Làm thế nào để có được proxy? Khi tôi gọi getPort client cố gắng kết nối và sau đó treo mãi mãi nếu máy chủ không đáp ứng.

CẬP NHẬT: Mã này được gọi từ trong phương thức applets() nếu có bất kỳ sự khác biệt nào.

Trả lời

0

Bạn có thể truyền đối tượng VoipDB của mình tới BindingProvider. Vì vậy, trong ví dụ trong liên kết bạn vừa đưa ra, hãy thay thế proxy theo db và bạn đã sẵn sàng sử dụng.

+1

Điều này thực sự không làm việc vì khách hàng treo trên dòng nơi getPort được gọi. – Lukasz

+0

Vâng, đó là tất cả những gì bạn có thể làm với phương pháp được cung cấp trong liên kết. jax-ws tải xuống WSDL của dịch vụ để tạo proxy. Nhiều khả năng đây là nguyên nhân gây rắc rối cho bạn. Điều duy nhất tôi có thể nghĩ đến ngay bây giờ là tải xuống một bản sao cục bộ của WSDL và sử dụng nó nhưng tất nhiên điều này không thực sự thanh lịch ... – musiKk

1

Nếu bạn đang sử dụng Sun JRE, bạn có thể đặt các thuộc tính hệ thống sau để kết nối mạng mặc định và đọc thời gian chờ (tính bằng mili giây). Tôi đã không thử những điều này với khách hàng JAX-WS, nhưng họ phải làm việc ở đó cũng như:

sun.net.client.defaultConnectTimeout 
sun.net.client.defaultReadTimeout 

Addition: tôi đã bỏ lỡ phần cuối cùng của bạn trong những câu hỏi mà bạn nói rằng bạn đang làm điều này trong một applet. Nếu applet đang chạy với quyền mặc định, có thể bạn không được phép thiết lập thuộc tính hệ thống.

+0

Applet được ký. Điều này khó tái tạo. Bởi vì khách hàng treo cứng khi máy chủ treo (không phải khi nào là xuống). – Lukasz

+1

Bạn có thể mô phỏng một máy chủ TCP treo với mã máy chủ này: ServerSocket serverSocket = new ServerSocket (PORT); trong khi (đúng) { serverSocket.accept(); } Chỉ chấp nhận, nhưng không bao giờ đọc hoặc viết bất cứ điều gì ở bên "máy chủ giả". – auramo

6

Với Metro/Glassfish ...

//1 minute for connection 
((BindingProvider) wsPort).getRequestContext().put("com.sun.xml.ws.connect.timeout", 1 * 60 * 1000); 

//3 minutos for request 
((BindingProvider) wsPort).getRequestContext().put("com.sun.xml.ws.request.timeout", 3 * 60 * 1000); 
+1

Thực ra đó là những gì được nói trong câu trả lời thứ nhất (và trong chính câu hỏi) Cũng có thể có ý nghĩa khi nhập khẩu com.sun.xml.ws.developer.JAXWSProperties' và sử dụng 'JAXWSProperties.CONNECT_TIMEOUT' và' JAXWSProperties.REQUEST_TIMEOUT' nếu ai đó không sợ cặp vợ chồng với mặt trời. –

+0

Làm thế nào để có được cá thể wsPort? – mvmn

+1

Dường như không hoạt động. –

1
ProxyWs proxy = (ProxyWs) factory.create(); 
Client client = ClientProxy.getClient(proxy); 
HTTPConduit http = (HTTPConduit) client.getConduit(); 
HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy(); 
httpClientPolicy.setConnectionTimeout(0); 
httpClientPolicy.setReceiveTimeout(0); 
http.setClient(httpClientPolicy); 

này đã làm việc cho tôi.

0

Dưới đây là một ví dụ

public void testConfigureTimeout() throws Exception 
{ 
    //Set timeout until a connection is established 
    ((BindingProvider)port).getRequestContext() 
    .put("javax.xml.ws.client.connectionTimeout", "6000"); 

    //Set timeout until the response is received 
    ((BindingProvider) port).getRequestContext() 
    .put("javax.xml.ws.client.receiveTimeout", "1000"); 

    port.echo("testTimeout"); 
} 
Các vấn đề liên quan