【问题标题】:Read timeout on a web service, but the operation still completes?Web 服务上的读取超时,但操作仍然完成?
【发布时间】:2011-11-07 19:21:17
【问题描述】:

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

java.net.SocketTimeoutException: Read timed out

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

【问题讨论】:

  • 如果您在套接字上设置了读取超时,那么这是预期的行为。尝试配置您的底层套接字,使其在等待响应时不会超时。不过,我不知道如何在 Axis 中做到这一点。

标签: java web-services networking soap timeout


【解决方案1】:

这是预期的行为,而不是错误。 Web 服务背后的操作对您的读取超时一无所知,因此继续处理该操作。

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

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

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

【讨论】:

  • 服务器确实不在我的控制之下。我想我必须捕获那些读取超时异常并尝试查询 WS 如果操作成功。谢谢。
【解决方案2】:

我有类似的问题。我们在 Jboss EAP6(或 JBOSS 7)上运行 JAX-WS 肥皂网络服务。默认 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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多