2

有一个使用 Saxon 8.7 执行 XSLT 转换的 Java Cocoon 应用程序。一种这样的 xslt 使用文档函数来注入远程 xml 资源的内容。因此调用如下所示: <xsl:apply-templates select="document(@href)/p-topic" mode="static-topic"/>

远程文档是可访问的(使用 wget 测试),该远程主机没有使用代理。但是,我得到以下异常堆栈跟踪:

引起:org.apache.commons.lang.exception.NestableRuntimeException:net.sf.saxon.trans.DynamicError:net.sf.saxon.trans.DynamicError:java.net.ConnectException:连接超时
        在 java.net.PlainSocketImpl.socketConnect(本机方法)
        在 java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333)
        在 java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195)
        在 java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182)
        在 java.net.Socket.connect(Socket.java:519)
        在 java.net.Socket.connect(Socket.java:469)
        在 sun.net.NetworkClient.doConnect(NetworkClient.java:157)
        在 sun.net.www.http.HttpClient.openServer(HttpClient.java:388)

超时发生在大约 20 秒后。

最后,将应用程序移动到另一台服务器后,问题出现了。在初始服务器上,相同的代码可以正常工作。所以这取决于环境。

我还分析了 netstat 输出。以下连接出现在正在运行的 XSLT 转换上:

Proto Recv-Q Send-Q 本地地址 外部地址 状态 用户 Inode PID/程序名称
tcp 0 1 ::ffff:134.27.100.67:37600 ::ffff:134.27.97.142:8510 SYN_SENT 22484/java
tcp 8559 0 ::ffff:134.27.100.67:55835 ::ffff:134.27.97.143:80 已建立 22484/java

134.27.97.143:80 是目标远程 xml 资源位置。我不知道为什么 SYN_SENT 连接出现在另一台服务器上。

大约 5 秒后,第二个连接变为以下内容:

tcp 8560 0 ::ffff:134.27.100.67:55835 ::ffff:134.27.97.143:80 CLOSE_WAIT 22484/java

大约 15 秒后(浏览器现在超时)第一个连接消失,第二个连接更改为以下内容:

tcp 0 0 ::ffff:134.27.100.67:55835 ::ffff:134.27.97.143:80 CLOSE_WAIT 22484/java

大约 5 秒钟后,第二个连接也消失了。我不是 netstat 专家,但在超时发生之前,Recv-Q 值保持非零值似乎很可疑。所以看起来应用程序在从 TCP 套接字队列读取数据时挂起。我尝试过不同的tomcat(5和6)。有任何想法吗?

4

1 回答 1

0

Finally I've managed to identify the root cause. It's appeared that those remote documents have DOCTYPE declarations of DTD files. Those DTD files are not accessible from the new server while they are accessible from the old server. So it seems Saxon tries to download the DTDs for validation and fails to do it with "Connection timed out" exception.

于 2013-10-30T16:26:43.703 回答