我可以为Axis 1.4使用不同的解析器吗?

时间:2013-10-17 15:46:07

标签: java web-services axis xstream xerces

当前的SAX解析器需要花费大量时间(20分钟)和堆内存(大约400mb)来根据日志反序列化来自soap服务器的响应。我们的响应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框架,以便内存管理和响应时间有利?

1 个答案:

答案 0 :(得分:0)

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

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

要添加XML解析器,请获取您选择的JAXP 1.1 XML兼容解析器。我们推荐xml-xerces发行版的Xerces jars,尽管其他的大多数都可以使用。除非您的JRE或app服务器有自己的特定要求,否则可以将解析器的库添加到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% ...