CXF服务客户端中的“IOException:Strange I / O stream”

时间:2013-04-24 17:45:01

标签: java web-services soap cxf

我们看到CXF出现间歇性错误。响应相当大(几百KB),启用了MTOM,为CXF请求/响应日志记录拦截器启用DEBUG修复了问题,类似于this post(未解析)。我们的项目正在利用CXF 2.2.9版本。

javax.xml.ws.soap.SOAPFaultException: Unmarshalling Error: [was class java.io.IOException] Strange I/O stream, returned 0 bytes on read 
                at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:146)
                at com.sun.proxy.$Proxy751.browseFiles(Unknown Source)
…
                at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.RuntimeException: [was class java.io.IOException] Strange I/O stream, returned 0 bytes on read
                at com.ctc.wstx.util.ExceptionUtil.throwRuntimeException(ExceptionUtil.java:18)
                at com.ctc.wstx.sr.StreamScanner.throwLazyError(StreamScanner.java:731)
                at com.ctc.wstx.sr.BasicStreamReader.safeFinishToken(BasicStreamReader.java:3657)
                at com.ctc.wstx.sr.BasicStreamReader.getTextCharacters(BasicStreamReader.java:830)
                at com.sun.xml.bind.v2.runtime.unmarshaller.StAXStreamConnector.handleCharacters(StAXStreamConnector.java:323)
…
                at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:124)
                ... 51 more
Caused by: java.io.IOException: Strange I/O stream, returned 0 bytes on read
                at com.ctc.wstx.io.BaseReader.reportStrangeStream(BaseReader.java:148)
                at com.ctc.wstx.io.UTF8Reader.loadMore(UTF8Reader.java:373)
…

我最初认为这是由响应数据中的错误/无效字符(编码?)引起的;但是,它现在看起来更像是一个网络问题。很奇怪,该服务在遇到此问题之前已经运行了很长时间(几年)而没有问题。

为什么会出现此错误?有没有办法在不启用调试日志的情况下解决这个问题?

2 个答案:

答案 0 :(得分:2)

升级到新版本的CXF可能会解决这个问题。 CXF哑剧流中有一些错误。特别是,这看起来非常类似于:

https://issues.apache.org/jira/browse/CXF-3068

答案 1 :(得分:1)

基于this并考虑com.ctc.wstx.io.UTF8Reader.loadMore的源代码,当传递给mBufferBaseReader(ReaderConfig, InputStream, byte[], int, int)的缓冲区长度为零时,问题就出现了。

loadMore()方法实现是否正确?如果read()返回0,他们应该这样做吗?