1

我正在编写一个实现 Web 服务的独立应用程序,其端点是使用嵌入式 Sun HttpServer 发布的。我对此有一个奇怪的问题,在特定的部署情况下,服务器处理/发送回复和客户端接收回复之间存在明显的延迟。

让我给出几个场景:

案例 1)工作:服务器在 Eclipse 中运行,它使用 OpenJDK 1.6.0_23 作为运行时。客户端是用axis(不是axis2!)实现的,并且在JBoss 内的Solaris x86 上运行(必须承认我不知道使用的确切Java 版本,但我怀疑是Java 5 版本)。

案例 2)工作:服务器在 Solaris x86 上运行,java 1.6.0_26,客户端在 Eclipse 中运行,OpenJDK 1.6.0_23。

案例 3) 不工作:服务器在 Solaris x86 上运行 java 1.6.0_26,客户端在 Solaris x86 上,轴在 Solaris x86 上(再次怀疑它是 Java 5,而不是 6)。

我想知道我是否会遇到以下 Java 错误,该错误已在 1.6.0_30 中修复(假设 OpenJDK 1.6.0_xx 没有遇到同样的错误)?

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7068416

但如果是这样,那为什么案例 2 会起作用呢?客户端可以以某种方式控制服务器端的 TCP_NODELAY吗?

关于我观察到的确切延迟:我有 2 个 Web 服务,在不同的上下文中发布。例如 2 个不同的 WSDL。客户端(显然)对每个服务都有单独的(轴 1)绑定。对于一项服务,我看到一致的延迟正好是 150 秒,而对于另一项服务,延迟始终是 300 秒。这些价值观会给任何人敲响警钟吗?

马丁

编辑 我现在倾向于Eclipse Generated Web Service Client Extremely Slow中的原因和解决方案。目前无法测试,因为我正坐在酒店房间里,无法访问系统。

4

1 回答 1

0

好的,通过告诉 Axis 使用 CommonsHttpSender 而不是默认的 HttpSender,设法解决了这个问题。由于相关应用程序已经在其 WEB-INF/lib 目录中拥有了必备的 jar,所以这没什么大不了的。

要使 Axis (1.4) 使用 CommonsHttpSender,请在以下位置创建一个“client-config.wsdd”文件(注意:这是让我头疼的不明显部分):

MY.ear/MY.war/WEB-INF/classes/org/apache/axis/client/client-config.wsdd

内容如下:

<?xml version="1.0" encoding="UTF-8"?> 
<deployment 
    name="commonsHTTPConfig" 
    xmlns="http://xml.apache.org/axis/wsdd/" 
    xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">

   <!-- use CommonsHTTPSender instead of the default HTTPSender -->
  <transport name="http" pivot="java:org.apache.axis.transport.http.CommonsHTTPSender" />  

  <transport name="local" pivot = "java:org.apache.axis.transport.local.LocalSender" /> 
  <transport name="java" pivot="java:org.apache.axis.transport.java.JavaSender" /> 
</deployment>

重新启动您的应用程序。在此更改之后,Axis 将使用 HTTP/1.1 进行 Web 服务调用,这似乎是纠正这种烦人的延迟所需的全部内容。似乎HTTP 协议规范(或者可能是 Axis 的实现)中有些东西不喜欢 HTTP/1.1 对 HTTP/1.0 请求的响应。

马丁

于 2011-12-19T08:37:02.080 回答