【问题标题】:How can I tell why I'm getting an IOException at line 113 in com.sun.jdmk.comm.HttpSendSocket我怎么知道为什么我在 com.sun.jdmk.comm.HttpSendSocket 的第 113 行得到一个 IOException
【发布时间】:2014-03-13 22:00:21
【问题描述】:

我的基于 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)

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

【问题讨论】:

  • 没有返回状态码或者可能是一条消息?你打电话的网址是什么?
  • 状态代码或消息的方式根本没有太多帮助。只是一个堆栈跟踪。我希望我可以创建自己的 HttpSendSocket 类来扩展原始类并添加一些诊断,但 HttpSendSocket 是包保护的,所以我不知道如何继续。
  • 但是有没有返回消息或状态码?它实际上可能对您有很大帮助:-)
  • 没有任何帮助。我只知道错误来自我的代码中的哪个位置。
  • 发布堆栈跟踪。期待没有它的答案是乌托邦式的。

标签: java jdmk


【解决方案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));

【讨论】:

  • 谢谢,雪莉!!!!很棒的发现。当返回数据不可序列化时,就会出现问题,发生的错误非常模糊。
【解决方案2】:

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

【讨论】:

  • 谢谢,我会试一试。仅供参考,我正在使用 Eclipse。设置断点技术的问题是我不能随意让这个问题发生。这是非常断断续续的。所以我真的希望简单地添加一些诊断、重建并从命令行运行代码。同样,我会看看我是否可以使用您建议的技术。谢谢!
  • 我还在寻找,但 Eclipse 想要包含源代码的 jdmkrt.jar 文件。你是怎么知道的?
  • 你有源代码吗?从你的帖子我得到了这样的印象。如果是这样,您应该能够只压缩源代码树,如果它不占用目录,则将其提供给 eclipse。
  • 我自己没有来源。我只在互联网上看到了各个类文件的来源。 Eclipse 允许我附加源文件,但它需要在 jar 或 zip 文件中,而我没有那个...
  • 好的,如果你没有源代码(也不能从任何地方下载),你不能这样做。或者,如果你只有那个类代码,你可以通过为它创建一个源代码树来附加它。除此之外,您可以尝试带有一些调试信息的新版本的想法。或者如果可能的话尝试另一个开源实现,你应该能够调试那些..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-08-12
  • 2019-11-12
  • 1970-01-01
  • 2021-07-14
  • 1970-01-01
  • 2013-07-28
  • 1970-01-01
相关资源
最近更新 更多