调用 Soap WS,结果为"Couldn't get a SAX parser while constructing a envelope"错误



在调用Soap WebService时,我们遇到了这个错误。这背后的原因是什么呢?

我使用JDK 7更新U67(64位),Spring 3.1.1。发布,Spring WS 2.1.0。RELEASE (spring-ws-core-2.1.0.RELEASE.jar),

下面是stacktrace日志:

----- ERROR [7-thread-1] xxxxxxxxxxxxxxxxxxx.webservice.WebServiceCallTemplateImpl:45 An error occured when connecting to service.
org.springframework.ws.soap.saaj.SaajSoapEnvelopeException: Could not access envelope: Couldn't get a SAX parser while constructing a envelope; nested exception is com.sun.xml.internal.messaging.saaj.SOAPExceptionImpl: Couldn't get a SAX parser while constructing a envelope
at org.springframework.ws.soap.saaj.SaajSoapMessage.getSaajVersion(SaajSoapMessage.java:260)
at org.springframework.ws.soap.saaj.SaajSoapMessage.getImplementation(SaajSoapMessage.java:342)
at org.springframework.ws.soap.saaj.SaajSoapMessage.<init>(SaajSoapMessage.java:117)
at org.springframework.ws.soap.saaj.SaajSoapMessageFactory.createWebServiceMessage(SaajSoapMessageFactory.java:186)
at org.springframework.ws.soap.saaj.SaajSoapMessageFactory.createWebServiceMessage(SaajSoapMessageFactory.java:60)
at org.springframework.ws.transport.AbstractWebServiceConnection.receive(AbstractWebServiceConnection.java:90)
at org.springframework.ws.client.core.WebServiceTemplate.doSendAndReceive(WebServiceTemplate.java:589)
at org.springframework.ws.client.core.WebServiceTemplate.sendAndReceive(WebServiceTemplate.java:537)
at org.springframework.ws.client.core.WebServiceTemplate.marshalSendAndReceive(WebServiceTemplate.java:384)
at org.springframework.ws.client.core.WebServiceTemplate.marshalSendAndReceive(WebServiceTemplate.java:374)
at com.xxxxxxxxxxx.commons.webservice.WebServiceCallTemplateImpl.sendAndReceive(WebServiceCallTemplateImpl.java:38)
at com.xxxxxxxxxxx.commons.webservice.WebServiceCallTemplateImpl.sendAndReceiveNoError(WebServiceCallTemplateImpl.java:73)
at com.xxxxxxxxxxx.commons.webservice.ServerCallTemplate.sendAndReceiveNoError(ServerCallTemplate.java:61)
at com.xxxxxxxxxxxxxxxxxxxxxxxxxxx.xxxxxxxxxxxxxxxxxxxxxxxClient.readDocument(QaDocumentReaderClient.java:39)
at com.xxxxxxxxxxxxxxxxxxxxxxxxxxx.xxxxxxxxxxxxxxxxxxxxxxxService.readDocument(QaDocumentReadService.java:44)
at com.xxxxxxxxxxxxxxxxxxxxxxxxxxx.xxxxxxxxxxxxxxxxxxxxxxxService$$FastClassByCGLIB$$50e93444.invoke(<generated>)
at net.sf.cglib.proxy.MethodProxy.invoke(MethodProxy.java:191)
at org.springframework.aop.framework.Cglib2AopProxy$CglibMethodInvocation.invokeJoinpoint(Cglib2AopProxy.java:689)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:622)
at com.xxxxxxxxxxxxxxxxxxxxxxxxxxx.xxxxxxxxxxxxxxxxxxxxxxxService$$EnhancerByCGLIB$$98b68ed1.readDocument(<generated>)
at com.xxxxxxxxxxxxxxxxxxxxxxxxxxx.xxxxxxxxxxxxxxxxxxxxxxxRunnable.run(QaDocumentReadRunnable.java:38)
at WICKET_com.xxxxxxxxxxxxxxxxxxxxxxxxxxx.QaDocumentReadRunnable$$FastClassByCGLIB$$ab78176e.invoke(<generated>)
at net.sf.cglib.proxy.MethodProxy.invoke(MethodProxy.java:191)
at org.apache.wicket.proxy.LazyInitProxyFactory$CGLibInterceptor.intercept(LazyInitProxyFactory.java:333)
at WICKET_com.xxxxxxxxxxxxxxxxxxxxxxxxxxx.xxxxxxxxxxxxxxxxxxxxxxxRunnable$$EnhancerByCGLIB$$46e7e20f.run(<generated>)
at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
at java.util.concurrent.FutureTask.runAndReset(Unknown Source)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(Unknown Source)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Caused by: com.sun.xml.internal.messaging.saaj.SOAPExceptionImpl: Couldn't get a SAX parser while constructing a envelope
at com.sun.xml.internal.messaging.saaj.soap.EnvelopeFactory.createEnvelope(Unknown Source)
at com.sun.xml.internal.messaging.saaj.soap.ver1_1.SOAPPart1_1Impl.createEnvelopeFromSource(Unknown Source)
at com.sun.xml.internal.messaging.saaj.soap.SOAPPartImpl.getEnvelope(Unknown Source)
at org.springframework.ws.soap.saaj.support.SaajUtils.getSaajVersion(SaajUtils.java:155)
at org.springframework.ws.soap.saaj.SaajSoapMessage.getSaajVersion(SaajSoapMessage.java:257)
... 34 more
Caused by: org.xml.sax.SAXException
java.lang.InterruptedException
at com.sun.xml.internal.messaging.saaj.util.ParserPool.get(Unknown Source)
... 39 more
Caused by: java.lang.InterruptedException
at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireInterruptibly(Unknown Source)
at java.util.concurrent.locks.ReentrantLock.lockInterruptibly(Unknown Source)
at java.util.concurrent.ArrayBlockingQueue.take(Unknown Source)
... 40 more

有人遇到同样的问题吗?

该错误意味着运行SOAP调用的线程已被中断,而堆栈跟踪(com.sun.xml.internal.messaging.saaj.util.ParserPool#get())中显示的特定方法恰好在中断发生后执行对可中断方法的第一个调用。由于线程属于线程池,这可能是由于调用ThreadPoolExecutorshutdownNow()方法引起的。

确实,shutdownNow()是这个问题背后的根本原因。作为解决方案,shutdownNow()被shutdown()取代,原因如下:

  • shutdownNow()告诉执行器服务(ScheduledExecutorService),它不能接受新的任务,并尝试通过中断相关线程来取消已经提交的任务。InterruptedException,而方法shutdown()只会告诉执行器服务它不能接受新的任务,但是已经提交的任务会继续运行直到结束

我有这个错误,这是由于我在

中的run方法返回的ConfigurableApplicationContext上调用close引起的
@SpringBootApplication
public class MyApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args).close();
    }
}

删除.close()使中断消失

最新更新