我们已经实现了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]。
我不确定是否还有其他我失踪的配置。你能帮我解决这个问题吗?
Vesrions: Java:jdk1.6.0_21
Metro:Metro / 2.3
HTTP: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);