0

当前的 SAX 解析器需要大量时间(20 分钟)和堆内存(大约 400mb)来根据日志反序列化来自肥皂服务器的响应。我们的响应 XML 的平均大小为 4 mb。

在堆外运行应用程序时的一部分日志如下

DEBUG (org.apache.axis.encoding.DeserializationContext) Pushing handler org.apache.axis.message.SOAPHandler@16d22f1
DEBUG (org.apache.axis.i18n.ProjectResourceBundle) org.apache.axis.i18n.resource::handleGetObject(newElem00)
DEBUG (org.apache.axis.message.MessageElement) New MessageElement (org.apache.axis.message.MessageElement@112c22) named {}name
DEBUG (org.apache.axis.encoding.DeserializationContext) Pushing element name
DEBUG (org.apache.axis.utils.NSStack) NSPush (32)
DEBUG (org.apache.axis.encoding.DeserializationContext) Exit: DeserializationContext::startElement()
DEBUG (org.apache.axis.encoding.DeserializationContext) Enter: DeserializationContext::endElement(, name)
DEBUG (org.apache.axis.i18n.ProjectResourceBundle) org.apache.axis.i18n.resource::handleGetObject(popHandler00)
DEBUG (org.apache.axis.encoding.DeserializationContext) Popping handler org.apache.axis.message.SOAPHandler@16d22f1
DEBUG (org.apache.axis.utils.NSStack) NSPop (32)
DEBUG (org.apache.axis.encoding.DeserializationContext) Popped element stack to org.apache.axis.message.MessageElement:property
DEBUG (org.apache.axis.encoding.DeserializationContext) Exit: DeserializationContext::endElement()
DEBUG (org.apache.axis.encoding.DeserializationContext) Enter: DeserializationContext::startElement(, value)
DEBUG (org.apache.axis.i18n.ProjectResourceBundle) org.apache.axis.i18n.resource::handleGetObject(pushHandler00)
DEBUG (org.apache.axis.encoding.DeserializationContext) Pushing handler org.apache.axis.message.SOAPHandler@16880ba
DEBUG (org.apache.axis.i18n.ProjectResourceBundle) org.apache.axis.i18n.resource::handleGetObject(newElem00)
DEBUG (org.apache.axis.message.MessageElement) New MessageElement (org.apache.axis.message.MessageElement@1db74af) named {}value
DEBUG (org.apache.axis.encoding.DeserializationContext) Pushing element value
DEBUG (org.apache.axis.utils.NSStack) NSPush (32)
DEBUG (org.apache.axis.encoding.DeserializationContext) Exit: DeserializationContext::startElement()
DEBUG (org.apache.axis.encoding.DeserializationContext) Enter: DeserializationContext::endElement(, value)
DEBUG (org.apache.axis.i18n.ProjectResourceBundle) org.apache.axis.i18n.resource::handleGetObject(popHandler00)
DEBUG (org.apache.axis.encoding.DeserializationContext) Popping handler org.apache.axis.message.SOAPHandler@16880ba
DEBUG (org.apache.axis.utils.NSStack) NSPop (32)

由于技术原因,我不能使用 Axis2。

我尝试使用 HTTP Commons 客户端而不是 HTTP 客户端,但响应时间保持不变。

在这种情况下,我如何将不同的解析器(例如 xerces 2.10.0 或 xstream 1.3.1?)链接到 Axis 1.4 框架,以便有利于内存管理和响应时间?

4

1 回答 1

0

从这个安装链接 在 Axis 目录中,您会找到一个 WEB-INF 子目录。此目录包含一些基本配置信息,但也可用于包含您希望部署的依赖项和 Web 服务。

Axis 需要能够找到 XML 解析器。如果您的应用程序服务器或 Java 运行时没有使 Web 应用程序可见,您需要下载并添加它。Java 1.4 包括 Crimson 解析器,因此您可以省略此阶段,尽管 Axis 团队更喜欢 Xerces。

要添加 XML 解析器,请获取您选择的 JAXP 1.1 XML 兼容解析器。我们推荐来自 xml-xerces 发行版的 Xerces jar,尽管其他大部分都可以使用。除非您的 JRE 或应用服务器有自己的特定要求,否则您可以将解析器的库添加到 axis/WEB-INF/lib。本指南中的示例使用 Xerces。本指南将 xml-apis.jar 和 xercesImpl.jar 添加到 AXISCLASSPATH,以便 Axis 可以找到解析器(见下文)。

如果您收到与 Xerces 或 DOM 相关的 ClassNotFound 错误,则说明您没有安装 XML 解析器,或者您的 CLASSPATH(或 AXISCLASSPATH)变量配置不正确。为了使这些示例正常工作,java 必须能够找到 axis.jar、commons-discovery.jar、commons-logging.jar、jaxrpc.jar、saaj.jar、log4j-1.2.8.jar(或任何合适的用于您选择的日志记录实现),以及 XML 解析器 jar 文件或文件(例如,xerces.jar)。这些示例通过将这些文件添加到 AXISCLASSPATH,然后在运行它们时指定 AXISCLASSPATH 来实现此目的。同样对于这些示例,我们已将 xml-apis.jar 和 xercesImpl.jar 文件复制到 AXIS_LIB 目录中。另一种方法是将您的 XML 解析器的 jar 文件直接添加到 AXISCLASSPATH 变量中,或者将所有这些文件添加到您的 CLASSPATH 变量中。

在 Windows 上,这可以通过以下方式完成。对于本文档,我们假设您已在 C:\axis 中安装了 Axis。要将此信息永久存储在 WinNT/2000/XP 中,您需要右键单击“我的电脑”并选择“属性”。单击“高级”选项卡并创建新的环境变量。通常最好使用写字板创建变量字符串,然后将其粘贴到适当的文本字段中。

set AXIS_HOME=c:\axis
set AXIS_LIB=%AXIS_HOME%\lib
set AXISCLASSPATH=%AXIS_LIB%\axis.jar;%AXIS_LIB%\commons-discovery.jar;
  %AXIS_LIB%\commons-logging.jar;%AXIS_LIB%\jaxrpc.jar;%AXIS_LIB%\saaj.jar;
  %AXIS_LIB%\log4j-1.2.8.jar;%AXIS_LIB%\xml-apis.jar;%AXIS_LIB%\xercesImpl.jar;
  %AXIS_LIB%\wsdl4j.jar

Unix 用户必须做类似的事情。下面我们将 AXIS 安装到 /usr/axis 并使用 bash shell。有关差异,请参阅您的 shell 文档。要使变量永久化,您需要将它们添加到 shell 的启动(点)文件中。再次,请参阅您的 shell 的文档。

set AXIS_HOME=/usr/axis
set AXIS_LIB=$AXIS_HOME/lib
set AXISCLASSPATH=$AXIS_LIB/axis.jar:$AXIS_LIB/commons-discovery.jar:
  $AXIS_LIB/commons-logging.jar:$AXIS_LIB/jaxrpc.jar:$AXIS_LIB/saaj.jar:
  $AXIS_LIB/log4j-1.2.8.jar:$AXIS_LIB/xml-apis.jar:$AXIS_LIB/xercesImpl.jar:
  $AXIS_LIB/wsdl4j.jar
export AXIS_HOME; export AXIS_LIB; export AXISCLASSPATH

要使用 Axis 客户端代码,您可以在调用 Java 时选择 AXISCLASSPATH,方法是输入

java -cp %AXISCLASSPATH% ...
于 2013-10-17T17:47:59.343 回答