我们有一个在JBoss EAP 6.0上运行的J2EE应用程序,它使用来自第三方应用程序的SOAP Web服务。我们使用Spring-WS发送请求并收到我们的回复。
对于正常和大尺寸响应,应用程序工作得很好。但是,在调用特定Web服务(用于报告目的)时,第三方Web服务发送了大约250 MB的响应,并且Java应用程序无法处理它。事务超时并引发超时错误
下面的例外情况:
org.springframework.ws.client.WebServiceIOException: I/O error: Read timed out; nested exception is java.net.SocketTimeoutException: Read timed out
org.springframework.ws.client.WebServiceIOException: I/O error: Read timed out; nested exception is java.net.SocketTimeoutException: Read timed out
at org.springframework.ws.client.core.WebServiceTemplate.sendAndReceive(WebServiceTemplate.java:502)
at org.springframework.ws.client.core.WebServiceTemplate.marshalSendAndReceive(WebServiceTemplate.java:343)
at org.springframework.ws.client.core.WebServiceTemplate.marshalSendAndReceive(WebServiceTemplate.java:337)
at org.springframework.ws.client.core.WebServiceTemplate.marshalSendAndReceive(WebServiceTemplate.java:329)
但是,当在脱机模式下访问响应XML时,应用程序能够在一两分钟内处理该文件。
所以,这是我同步处理SOAP响应的问题(即实时):
我担心我不能回答问题#1,但我可以尝试回答#2:Spring-WS不对XML消息大小强制执行任何限制。但是,在内存中加载非常大的SOAP消息可能会有问题,这就是使用SaajSoapMessageFactory
(默认值)时会发生的情况。相反,切换到AxiomSoapMessageFactory,并关闭该页面上描述的有效负载缓存。这样,整个SOAP消息就不会加载到内存中。
也就是说,看起来你正在遭受读取超时而不是内存错误。您可能希望增加超时。最简单的方法是切换到HttpComponentsMessageSender
并在其上配置readTimeout
属性。