有一个使用 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)。有任何想法吗?