我有一个在Linux上运行的Java Web服务客户端(使用Axis 1.4),它调用对Windows服务器执行的一系列Web服务操作。有些事务操作会因此异常而失败:
java.net.SocketTimeoutException: Read timed out
但是,服务器上的操作已完成(即使客户端没有有用的响应)。这是Web服务器/客户端的错误吗?或者预计会在TCP套接字上发生?
答案 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);