【问题标题】:JAX-WS client closes tcp connection with FIN,ACKJAX-WS 客户端使用 FIN、ACK 关闭 tcp 连接
【发布时间】:2014-12-15 13:09:01
【问题描述】:

我们已经实现了一个 JAX-WS 客户端并面临以下问题。 这是一个有状态的会话同步流。客户端最初成功地一一发出两个请求/响应

该问题的 3 个不同案例

1)在前两个请求/响应之后,我在收到第二个请求的响应后的第 6 和第 9(两个不同的测试用例)秒后发出第三个请求。 在这两种情况下,从 tcpdump 我可以看到我们的客户端正在通过 [FIN,ACK] 关闭现有的 tcp 连接并为第三个请求打开一个新连接。 但由于这是有状态会话,服务器预计连接不应关闭,因此我们会收到错误响应。

2) 如果我在第 2 次请求后 5 秒内发出第 3 次请求,则重复使用相同的 tcp 连接。

3) 如果我根本不发出第三个请求,那么在 10 秒后自动(通过第二个请求的 [FIN,ACK],tcp 连接被客户端关闭。

基本上问题是客户端应用程序正在自行关闭 tcp 连接。 我已尝试设置以下所有属性。但我仍然面临同样的问题。

   BindingProvider bp = (BindingProvider)port;
   Map<String, Object> context = bp.getRequestContext();
  context.put(BindingProvider.SESSION_MAINTAIN_PROPERTY, true);

  context.put(JAXWSProperties.CONNECT_TIMEOUT, 60000);
  context.put(JAXWSProperties.REQUEST_TIMEOUT, 70000);

  context.put("com.sun.xml.ws.connect.timeout", 50000);
  context.put("com.sun.xml.ws.request.timeout", 50000);

  context.put("javax.xml.ws.client.connectionTimeout", 60000);
  context.put("javax.xml.ws.client.receiveTimeout", 70000);

我附上 pcap 文件的截图供您参考。在这里您可以看到客户端在 6 秒后发出的 [FIN,ACK]。

我不确定我是否缺少任何其他配置。你能帮我解决这个问题吗?

版本: Java:jdk1.6.0_21

地铁:地铁/2.3

HTTP:1.1

我注意到的另一件事是,请求中有一个“连接:保持活动”,但它在服务器的响应中不存在。不确定这是否是个问题

【问题讨论】:

  • 嗨。我遇到了完全相同的问题,但在我的情况下,客户端存根在 15 秒后关闭连接。你找到解决办法了吗?
  • @IgorZelaya nope..由于问题升级,我没有时间进一步检查。如果在超过 4 或 5 秒内没有实际流量,我会通过发送虚拟消息(如 ping)来提供解决方法。这样我就避免了连接被关闭。
  • 您确定它是 jax-ws 客户端本身,而不是客户端和服务提供商之间的代理或设备,具有不活动超时,例如防火墙? “keepalive”或 ping 也可以避免这种情况。在其他有状态或重用的连接场景(例如 jdbc 连接池)中很常见。 jax-ws 客户端应用记录或报告什么?

标签: java web-services tcp jax-ws java-metro-framework


【解决方案1】:

因为我遇到了同样的问题,所以我进行了进一步的调查。我发现这是 HTTP 1.1 默认行为。来自维基百科(persistent connection):

在 HTTP 1.1 中,除非声明,否则所有连接都被视为持久连接 否则。1 HTTP 持久连接不使用单独的 keepalive 消息,它们只允许多个请求使用单个 联系。但是,Apache httpd 的默认连接超时 1.3 和 2.0 只需 15 秒2[3] 而 Apache httpd 2.2 及更高版本只需 5 秒。[4][5]短超时的优点是 能够快速交付网页的多个组件,同时 不消耗资源来运行多个服务器进程或线程 太久了

所以基本上发生的事情是您的客户端在空闲时间达到配置的时间量(连接超时)后关闭连接。 Jax-ws 默认实现 apacheHttpUrlConnection,它具有预先配置的 15 秒超时。在我们在 Weblogic 12.1.3 上运行的客户端中,以下配置对我们有用:

final BindingProvider binding = (BindingProvider) port;
final Map<String, Object> ctx = binding.getRequestContext();
ctx.put("com.sun.xml.ws.request.timeout", requestTimeOut);
ctx.put("com.sun.xml.ws.connect.timeout", connectTimeOut);

【讨论】:

    猜你喜欢
    • 2019-06-09
    • 2013-04-27
    • 2022-01-05
    • 1970-01-01
    • 2015-02-26
    • 1970-01-01
    • 1970-01-01
    • 2013-08-11
    • 1970-01-01
    相关资源
    最近更新 更多