如何为 JAX-WS Web 服务客户端设置超时?

新手上路,请多包涵

我已经使用 JAXWS-RI 2.1 为我的 Web 服务创建了一个基于 WSDL 的接口。我可以毫无问题地与 Web 服务交互,但无法指定向 Web 服务发送请求的超时时间。如果由于某种原因它没有响应客户端似乎永远旋转它的轮子。

到处打猎表明我可能应该尝试做这样的事情:

 ((BindingProvider)myInterface).getRequestContext().put("com.sun.xml.ws.request.timeout", 10000);
((BindingProvider)myInterface).getRequestContext().put("com.sun.xml.ws.connect.timeout", 10000);

我还发现,根据您拥有的 JAXWS-RI 版本,您可能需要设置这些属性:

 ((BindingProvider)myInterface).getRequestContext().put("com.sun.xml.internal.ws.request.timeout", 10000);
((BindingProvider)myInterface).getRequestContext().put("com.sun.xml.internal.ws.connect.timeout", 10000);

我遇到的问题是,无论上述哪个是正确的,我都不知道 在哪里 可以做到这一点。我所拥有的只是一个 Service 子类,它实现了 Web 服务的自动生成接口,并且在实例化时,如果 WSDL 没有响应,那么设置特性:

 MyWebServiceSoap soap;
MyWebService service = new MyWebService("http://www.google.com");
soap = service.getMyWebServiceSoap();
soap.sendRequestToMyWebService();

谁能指出我正确的方向?!

原文由 ninesided 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.2k
2 个回答

我知道这是旧的并且在其他地方得到了回答,但希望这可以关闭。我不确定您为什么要动态下载 WSDL 但系统属性:

 sun.net.client.defaultConnectTimeout (default: -1 (forever))
sun.net.client.defaultReadTimeout (default: -1 (forever))

应该适用于使用 JAX-WS 使用的 HttpURLConnection 的所有读取和连接。如果您从远程位置获取 WSDL,这应该可以解决您的问题 - 但本地磁盘上的文件可能更好!

接下来,如果您想为特定服务设置超时,一旦您创建了代理,您需要将其转换为 BindingProvider(您已经知道),获取请求上下文并设置您的属性。在线 JAX-WS 文档是错误的,这些是正确的属性名称(嗯,它们对我有用)。

 MyInterface myInterface = new MyInterfaceService().getMyInterfaceSOAP();
Map<String, Object> requestContext = ((BindingProvider)myInterface).getRequestContext();
requestContext.put(BindingProviderProperties.REQUEST_TIMEOUT, 3000); // Timeout in millis
requestContext.put(BindingProviderProperties.CONNECT_TIMEOUT, 1000); // Timeout in millis
myInterface.callMyRemoteMethodWith(myParameter);

当然,这是一种可怕的做事方式,我会创建一个很好的工厂来生产这些绑定提供程序,这些提供程序可以注入你想要的超时。

原文由 alpian 发布,翻译遵循 CC BY-SA 2.5 许可协议

已接受答案中的属性对我不起作用,可能是因为我正在使用 JAX-WS 的 JBoss 实现?

使用一组不同的属性(在 JBoss JAX-WS 用户指南 中找到)使它起作用:

 //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");

更新 较新的 JBoss 规范位置(名称未更改)。请求 标准化网络超时名称

原文由 jwaddell 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题