非常奇怪的 Apache CXF 客户端错误

Very Strange Apache CXF Client Error

我在使用 SOAP Web 服务时遇到了一个非常奇怪的错误。奇怪的是,客户端在测试服务器上工作正常,但在生产服务器上尝试时,它因读取超时而失败:

[com.ctc.wstx.exc.WstxLazyException] Read timed out 

更奇怪的是,我在生产环境中使用的相同 SOAP 客户端代码库,当 运行 在我的本地机器上针对生产环境 SOAP WebService 服务器时 运行 完全没问题。只有在我们的生产客户端环境中,生产 SOAP WebService 服务器才会因此异常而失败。我对此一无所知,在过去的 4 个小时里,我一直试图与我的一位网络同事一起找出这个问题的根源,但没有成功。有什么线索吗?

我正在使用 Apache CXF!

这是一个很难解决的问题。这是我得到的例外情况:

Caused by: com.ctc.wstx.exc.WstxIOException: Read timed out
    at com.ctc.wstx.sr.StreamScanner.constructFromIOE(StreamScanner.java:633) ~[org.codehaus.woodstox.woodstox-core-asl-4.4.1.jar:4.4.1]
    at com.ctc.wstx.sr.StreamScanner.loadMore(StreamScanner.java:1007) ~[org.codehaus.woodstox.woodstox-core-asl-4.4.1.jar:4.4.1]
    at com.ctc.wstx.sr.BasicStreamReader.readTextSecondary(BasicStreamReader.java:4647) ~[org.codehaus.woodstox.woodstox-core-asl-4.4.1.jar:4.4.1]
    at com.ctc.wstx.sr.BasicStreamReader.finishToken(BasicStreamReader.java:3722) ~[org.codehaus.woodstox.woodstox-core-asl-4.4.1.jar:4.4.1]
    at com.ctc.wstx.sr.BasicStreamReader.safeFinishToken(BasicStreamReader.java:3676) ~[org.codehaus.woodstox.woodstox-core-asl-4.4.1.jar:4.4.1]
    ... 39 common frames omitted
Caused by: java.net.SocketTimeoutException: Read timed out
    at java.net.SocketInputStream.socketRead0(Native Method) ~[na:1.7.0_51]
    at java.net.SocketInputStream.read(SocketInputStream.java:152) ~[na:1.7.0_51]
    at java.net.SocketInputStream.read(SocketInputStream.java:122) ~[na:1.7.0_51]
    at java.io.BufferedInputStream.fill(BufferedInputStream.java:235) ~[na:1.7.0_51]
    at java.io.BufferedInputStream.read1(BufferedInputStream.java:275) ~[na:1.7.0_51]
    at java.io.BufferedInputStream.read(BufferedInputStream.java:334) ~[na:1.7.0_51]
    at sun.net.www.http.ChunkedInputStream.readAheadBlocking(ChunkedInputStream.java:552) ~[na:1.7.0_51]
    at sun.net.www.http.ChunkedInputStream.readAhead(ChunkedInputStream.java:609) ~[na:1.7.0_51]
    at sun.net.www.http.ChunkedInputStream.read(ChunkedInputStream.java:696) ~[na:1.7.0_51]
    at java.io.FilterInputStream.read(FilterInputStream.java:133) ~[na:1.7.0_51]
    at sun.net.www.protocol.http.HttpURLConnection$HttpInputStream.read(HttpURLConnection.java:3053) ~[na:1.7.0_51]
    at com.ctc.wstx.io.BaseReader.readBytes(BaseReader.java:155) ~[org.codehaus.woodstox.woodstox-core-asl-4.4.1.jar:4.4.1]
    at com.ctc.wstx.io.UTF8Reader.loadMore(UTF8Reader.java:368) ~[org.codehaus.woodstox.woodstox-core-asl-4.4.1.jar:4.4.1]
    at com.ctc.wstx.io.UTF8Reader.read(UTF8Reader.java:111) ~[org.codehaus.woodstox.woodstox-core-asl-4.4.1.jar:4.4.1]
    at com.ctc.wstx.io.MergedReader.read(MergedReader.java:105) ~[org.codehaus.woodstox.woodstox-core-asl-4.4.1.jar:4.4.1]
    at com.ctc.wstx.io.ReaderSource.readInto(ReaderSource.java:86) ~[org.codehaus.woodstox.woodstox-core-asl-4.4.1.jar:4.4.1]
    at com.ctc.wstx.io.BranchingReaderSource.readInto(BranchingReaderSource.java:56) ~[org.codehaus.woodstox.woodstox-core-asl-4.4.1.jar:4.4.1]
    at com.ctc.wstx.sr.StreamScanner.loadMore(StreamScanner.java:1001) ~[org.codehaus.woodstox.woodstox-core-asl-4.4.1.jar:4.4.1]
    ... 42 common frames omitted

请记住,WstxIOException 指向应用程序无法解析传入的 SOAP 消息。在我们的例子中,服务器以块的形式发送 SOAP 消息,而我们的应用程序并未接收到所有块。有一些网络防火墙丢弃了一些大于 1024kb 的数据包。这是在 tcp 级别上发生的。

我们的网络人员增加传入数据包的大小后,它立即开始工作!