读取Web服务的超时,但操作仍然完成?

时间:2011-08-31 16:59:09

标签: java web-services networking soap timeout

我有一个在Linux上运行的Java Web服务客户端(使用Axis 1.4),它调用对Windows服务器执行的一系列Web服务操作。有些事务操作会因此异常而失败:

java.net.SocketTimeoutException: Read timed out

但是,服务器上的操作已完成(即使客户端没有有用的响应)。这是Web服务器/客户端的错误吗?或者预计会在TCP套接字上发生?

2 个答案:

答案 0 :(得分:2)

这是预期的行为,而不是错误。 Web服务背后的操作对您的读取超时没有任何了解,因此继续处理操作。

您可以增加连接的超时 - 如果您手动操作套接字本身,则socket.connect()方法可能会超时(以毫秒为单位)。零应该避免你的时间超时 - 参见API文档。

如果在每种情况下操作都需要很长时间,您可能需要查看使其异步 - 第一个请求提交操作,然后第二个请求返回结果,可能需要一些轮询才能看到当结果准备就绪时。

如果您认为此操作应该在此时间内完成,您是否可以访问服务器以查看为什么需要这么长时间?

答案 1 :(得分:0)

我有类似的问题。我们在Jboss EAP6(或JBOSS 7)上运行JAX-WS soap webservice。除非在服务器或客户端中重写,否则默认的http套接字超时设置为60秒。为了解决这个问题,我将java客户端改为这样的。我不得不在这里使用3种不同的组合

这种组合似乎可以作为独立的Java客户端或Web服务客户端运行,作为其他Web服务器上其他应用程序的一部分运行。

//Set timeout on the client
String edxWsUrl ="http://www.example.com/service?wsdl";

URL WsURL = new URL(edxWsUrl);
EdxWebServiceImplService  edxService = new EdxWebServiceImplService(WsURL);
EdxWebServiceImpl edxServicePort = edxService.getEdxWebServiceImplPort();
//Set timeout on the client
BindingProvider edxWebserviceBindingProvider  = (BindingProvider)edxServicePort;
BindingProvider edxWebserviceBindingProvider  = (BindingProvider)edxServicePort;

edxWebserviceBindingProvider.getRequestContext().put("com.sun.xml.internal.ws.request.timeout", connectionTimeoutInMilliSeconds);
edxWebserviceBindingProvider.getRequestContext().put("com.sun.xml.internal.ws.connect.timeout", connectionTimeoutInMilliSeconds);

edxWebserviceBindingProvider.getRequestContext().put("com.sun.xml.ws.request.timeout", connectionTimeoutInMilliSeconds);
edxWebserviceBindingProvider.getRequestContext().put("com.sun.xml.ws.connect.timeout", connectionTimeoutInMilliSeconds);

edxWebserviceBindingProvider.getRequestContext().put("javax.xml.ws.client.receiveTimeout", connectionTimeoutInMilliSeconds);
edxWebserviceBindingProvider.getRequestContext().put("javax.xml.ws.client.connectionTimeout", connectionTimeoutInMilliSeconds);