我的基于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)
正如我所说,任何有用的建议都会受到赞赏。
答案 0 :(得分:1)
通信异常是由使用ArrayList方法subList引起的。 ArrayList是可序列化的,但子列表数据不可序列化,因此您无法通过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));
答案 1 :(得分:0)
将JDMK源附加到IDE,然后在HttpSendSocket中设置断点并在启用调试的情况下运行它。至少在IntelliJ中,您可以通过尝试从堆栈跟踪中打开类,然后选择链接源来附加库源。不知道这个过程对于其他IDE是怎样的,但我希望它是可能的。