迁移后,XSLT文档函数抛出“连接超时”异常

时间:2013-10-23 11:15:29

标签: java sockets xslt saxon netstat

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

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

Caused by: 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秒后发生暂停。

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

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

Proto Recv-Q Send-Q Local Address               Foreign Address             State       User       Inode      PID/Program name
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     ESTABLISHED  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套接字队列中读取数据时会挂起。我尝试过不同的雄猫(5和6)。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

最后,我设法确定了根本原因。看来这些远程文档具有DTD文件的DOCTYPE声明。从旧服务器访问这些DTD文件时,无法从新服务器访问这些文件。因此,Saxon似乎试图下载DTD进行验证,但未能通过“连接超时”例外进行。