我有一个运行在Linux上的Java web服务客户机(使用Axis 1.4),它调用对Windows服务器执行的一系列web服务操作。有些时候,某些事务操作会因为以下异常而失败:
java.net.SocketTimeoutException: Read timed out
但是,服务器上的操作已经完成(即使客户机上没有有用的响应)。这是一个错误的web服务服务器/客户端?或者期望在TCP套接字上发生?
这是预期的行为,而不是错误。web服务背后的操作不知道你的读超时,所以继续处理操作。
您可以增加连接的超时时间—如果您手动操作套接字本身,则socket.connect()方法可以超时(以毫秒为单位)。0应该避免你的端超时-参见API文档。
如果操作在每种情况下都将花费很长时间,那么您可能想要考虑将其异步化-第一个请求提交操作,然后第二个请求返回结果,可能需要一些轮询来查看结果何时准备好。
如果你认为操作应该在这段时间内完成,你是否访问过服务器,看看为什么需要这么长时间?
我也有类似的问题。我们在Jboss EAP6(或Jboss 7)上运行JAX-WS soap web服务。默认的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);