JAX-WS客户端用FIN,ACK关闭tcp连接

时间:2014-12-15 13:09:01

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

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

问题的3个不同案例

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

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

3)如果我根本不提出第3个请求,那么在10秒后自动执行(通过[FIN,ACK]来自第2个请求,客户端将关闭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]。 enter image description here

我不确定是否还有其他我失踪的配置。你能帮我解决这个问题吗?

Vesrions: Java:jdk1.6.0_21

Metro:Metro / 2.3

HTTP:1.1

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

1 个答案:

答案 0 :(得分:1)

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

  

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

所以基本上发生的事情是你的客户端在配置的时间(连接超时)空闲后关闭连接。 Jax-ws默认实现apache HttpUrlConnection,它具有预先配置的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);