gpt4 book ai didi

java - CentOS 4 上 Java 1.6 的相当神秘的 SocketException

转载 作者:行者123 更新时间:2023-11-30 11:37:00 26 4
gpt4 key购买 nike

我有一个 JAX-RS 网络服务的 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获得一个新的连接,并且后面的类显然在连接返回之前关闭了它自己的套接字,我的任何代码都可以到达它。

此外,测试中有 friend 对相同的服务进行相同的服务器设置,并且可以毫无问题地与之对话。

更进一步,以下咒语(略有缩写)是一种解决方法:

@Before
public void pingServiceToWorkAroundCentos() {
try {
/* ... code to make a connection to the service and close it ... */
} catch (Throwable t) {
// do nothing
}
}

换句话说,如果我在运行每个测试用例之前安排一个额外的一次性连接,那么无论这个问题是什么,它都会用完。

这会是什么?

最佳答案

由于这里只有回溯而没有代码,我假设存在某种竞争条件或错误,在当前线程尝试获取 OutputStream 时套接字被另一个线程先于关闭。

查看 JDK 的源代码,我看到了这个...

public Object getOption(int opt) throws SocketException {
if (isClosedOrPending()) {
throw new SocketException("Socket Closed");
}
... snip ...

isClosedOrPending 方法检查内部 FD 是否为 null 或关闭是否挂起,即已在套接字上调用关闭。

祝你好运。

关于java - CentOS 4 上 Java 1.6 的相当神秘的 SocketException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14270311/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com