我对 JAX-RS Web 服务进行了 JUnit 测试。测试启动嵌入式 tomcat,然后通过 Apache CXF JAX-RS 客户端与其对话。
考虑这个回溯:
Caused by: java.net.SocketException: Socket Closed
at java.net.PlainSocketImpl.getOption(PlainSocketImpl.java:286)
at java.net.Socket.getSoTimeout(Socket.java:1032)
at sun.net.www.http.HttpClient.available(HttpClient.java:356)
at sun.net.www.http.HttpClient.New(HttpClient.java:273)
at sun.net.www.http.HttpClient.New(HttpClient.java:310)
at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:987)
at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:923)
at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:841)
at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:1031)
这仅在 CentOS 4.8 上失败。相同的单元测试(启动嵌入式 tomcat,然后与其中的 Web 服务对话)在各种其他系统上运行良好。请注意此回溯的极端奇怪之处:HttpHRLConnection
已调用HttpClient
以获取新连接,并且稍后的类显然在返回连接之前关闭了自己的套接字,我的任何代码都可以访问它。
此外,测试中有朋友对相同的服务进行相同的服务器设置,并且可以毫无问题地与之交谈。
更进一步,以下咒语(略微缩写)是一种解决方法:
@Before
public void pingServiceToWorkAroundCentos() {
try {
/* ... code to make a connection to the service and close it ... */
} catch (Throwable t) {
// do nothing
}
}
换句话说,如果我在运行每个测试用例之前安排一个额外的一次性连接,那么无论这个问题是什么,都会用完。
这可能是什么?