我们目前称SOAP Web服务发回非常大的响应。
我们在调用Web服务时使用Spring-WS(使用WebServiceTemplate),JAX-WS客户端,并且应用程序在Jboss EAP 6.0上运行。
我们目前也使用SaajSoapMessageFactory。我从论坛上读到应该使用AxiomSoapMessageFactory而不是SaajSoapMessageFactory(http://docs.spring.io/spring-ws/site/reference/html/common.html)来提高阅读性能。
我做了以下修改:
代替
<bean id="messageFactory" class="org.springframework.ws.soap.saaj.SaajSoapMessageFactory">
<property name="soapVersion">
<util:constant static-field="org.springframework.ws.soap.SoapVersion.SOAP_11" />
</property>
</bean>
通过
<bean id="messageFactory" class="org.springframework.ws.soap.axiom.AxiomSoapMessageFactory">
<property name="payloadCaching" value="true"/>
</bean>
此更改按预期正常运行。但是,我上面提到的链接建议设置如下:
<property name="payloadCaching" value="false"/>
设置此选项后,当调用Web服务时,我得到以下异常:
org.springframework.ws.soap.axiom.AxiomSoapBodyException: Could not access envelope: null; nested exception is org.apache.axiom.om.NodeUnavailableException: org.springframework.ws.soap.axiom.AxiomSoapBodyException: Could not access envelope: null; nested exception is org.apache.axiom.om.NodeUnavailableException
at org.springframework.ws.soap.axiom.AxiomSoapEnvelope.getBody(AxiomSoapEnvelope.java:97) [:2.2.0.RELEASE]
at org.springframework.ws.soap.AbstractSoapMessage.getSoapBody(AbstractSoapMessage.java:38) [:2.2.0.RELEASE]
at org.springframework.ws.soap.AbstractSoapMessage.getPayloadSource(AbstractSoapMessage.java:50) [:2.2.0.RELEASE]
at org.springframework.ws.support.MarshallingUtils.unmarshal(MarshallingUtils.java:55) [:2.2.0.RELEASE]
at org.springframework.ws.client.core.WebServiceTemplate$3.extractData(WebServiceTemplate.java:413) [:2.2.0.RELEASE]
at org.springframework.ws.client.core.WebServiceTemplate.doSendAndReceive(WebServiceTemplate.java:616) [:2.2.0.RELEASE]
at org.springframework.ws.client.core.WebServiceTemplate.sendAndReceive(WebServiceTemplate.java:555) [:2.2.0.RELEASE]
at org.springframework.ws.client.core.WebServiceTemplate.marshalSendAndReceive(WebServiceTemplate.java:390) [:2.2.0.RELEASE]
at org.springframework.ws.client.core.WebServiceTemplate.marshalSendAndReceive(WebServiceTemplate.java:383) [:2.2.0.RELEASE]
at org.springframework.ws.client.core.WebServiceTemplate.marshalSendAndReceive(WebServiceTemplate.java:373) [:2.2.0.RELEASE]
有关此错误原因的任何想法?我是否错过了更改任何其他选项,或者是我使用的库文件的不兼容性。
另一个问题:
在评论出与og4j.logger.org.springframework.ws.client.MessageTracing相关的log4j条目后,我能够成功地使用该服务。还进行了性能测试,发现对于50个用户同时访问Web服务的测试(间接通过屏幕调用Web服务),总体响应时间(按钮被点击到响应的时刻)网络服务显示在屏幕上)从约27秒减少到22秒 - 这比SaajSoapMessageFactory好5秒的改进。但是,当我运行100个用户测试时,响应时间增加了2秒,SaajSoapMessageFactory在这种情况下似乎更好。尽管AxiomSoapMessageFactory使用流式传输并避免构建树,有人可以解释这种性能差异的原因吗?
答案 0 :(得分:1)
payloadCaching=false
指示Axiom不为有效负载构建对象模型树。这是实现性能增益的原因,但它也意味着有效载荷只能被访问一次。在较旧的Axiom版本中,尝试再次访问有效负载将导致有些模糊OMException
。在最新版本中,它会触发NodeUnavailableException
,{{1}}中会记录该{{1}}。正如您在评论中所述,在您的情况下,跟踪记录会消耗有效负载。