XSLT 文档函数在迁移后引发"Connection timed out"异常



有一个Java Cocoon应用程序使用Saxon 8.7执行XSLT转换。其中一个这样的 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: Connection timed out        at java.net.PlainSocketImpl.socketConnect(Native Method)        at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333)        at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195)        at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182)        at java.net.Socket.connect(Socket.java:519)        at java.net.Socket.connect(Socket.java:469)        at sun.net.NetworkClient.doConnect(NetworkClient.java:157)        at sun.net.www.http.HttpClient.openServer(HttpClient.java:388)

超时发生在大约 20 秒后。

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

我还分析了网络统计输出。正在运行的 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/javaTCP 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 秒后,第二个连接也会消失。我不是网络统计专家,但在超时发生之前,Recv-Q 值保持非零值似乎令人怀疑。因此,看起来应用程序在从 TCP 套接字队列读取数据时挂起。我尝试过不同的雄猫(5 和 6)。有什么想法吗?

最后,

我设法确定了根本原因。这些远程文档似乎具有 DTD 文件的 DOCTYPE 声明。这些 DTD 文件无法从新服务器访问,而可以从旧服务器访问。因此,似乎 Saxon 试图下载 DTD 进行验证,但未能完成"连接超时"异常。

相关内容

最新更新