1

我的基于 JDMK 的应用程序在 com.sun.jdmk.comm.HttpSendSocket 的第 313 行收到间歇性 IOExceptions,我不知道为什么。我从 Javadoc 中了解到的所有信息是,如果在创建输入流时发生 I/O 错误,您将获得 IOException,但我不知道发生了哪种 I/O 错误或为什么会发生。该代码实际上在此错误发生之前和之后都有效。

任何有关如何调试此间歇性问题的提示将不胜感激。

我不想在此处粘贴 HttpSendSocket 的源代码,因为它不属于我,但我知道当抛出 IOException 异常时它正在执行 HttpURLConnection conn.getInputStream() 。

我曾想过尝试创建自己的 HttpSendSocket 版本,并在其中添加诊断信息,但由于它是一个包保护类,所以我不知道怎么做。

下面的堆栈跟踪:

com.sun.jdmk.comm.CommunicationException: java.io.IOException: HTTP request failed
at com.sun.jdmk.comm.HttpSendSocket.readNotify(HttpSendSocket.java:313)
at com.sun.jdmk.comm.HttpSendInputStream.read(HttpSendInputStream.java:95)
at java.io.FilterInputStream.read(FilterInputStream.java:94)
at java.io.PushbackInputStream.read(PushbackInputStream.java:150)
at com.sun.jdmk.comm.GenericHttpConnectorClient.sendHttp(GenericHttpConnectorClient.java:486)
at com.sun.jdmk.comm.GenericHttpConnectorClient.invokeRemoteOperation(GenericHttpConnectorClient.java:2234)
at com.sun.jdmk.comm.GenericHttpConnectorClient.invoke(GenericHttpConnectorClient.java:1366)

正如我所说,任何有用的建议将不胜感激。

4

2 回答 2

1

使用 ArrayList 方法 subList 导致通信异常。ArrayList 是可序列化的,但 subList 数据不可序列化,因此您无法通过 HttpConnector 检索数据。解决方案是改变:

List<UserProcessInfo> values = new ArrayList<UserProcessInfo>();
...
values.size() <= 1000 ? values : values.subList(0,1000);

至:

List<UserProcessInfo> values = new ArrayList<UserProcessInfo>();
...
return values.size() <= 1000 ? values : new ArrayList<UserProcessInfo>(values.subList(0,1000));
于 2014-03-19T14:02:19.030 回答
0

将 JDK 源附加到您的 IDE,然后在 HttpSendSocket 中设置断点并在启用调试的情况下运行它。至少在 IntelliJ 中,您可以通过尝试从堆栈跟踪打开类,然后选择链接源来附加库源。不知道其他 IDE 的过程如何,但我希望它是可能的。

于 2014-03-13T22:15:54.200 回答