Как я могу сказать, почему я получаю IOException в строке 113 в com.sun.jdmk.comm.HttpSendSocket

1

Мое приложение на основе JDMK получает прерывистые IOExceptions в строке 313 в com.sun.jdmk.comm.HttpSendSocket, и я не могу понять, почему. Все, что я знаю из Javadoc об этом, - это ошибка ввода-вывода при создании входного потока, вы получите IOException, но я не знаю, какая ошибка ввода-вывода произошла или почему это произошло. Код действительно работал как до, так и после этой ошибки.

Любые советы о том, как отлаживать эту прерывистую проблему, будут оценены.

Я не хочу вставлять исходный код здесь для HttpSendSocket, поскольку он принадлежит не мне, но я знаю, что он делает HttpURLConnection conn.getInputStream(), когда генерируется исключение IOException.

Я думал о том, чтобы попытаться создать свою собственную версию 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)

Как я сказал, любые полезные предложения будут оценены.

Теги:
jdmk

2 ответа

1
Лучший ответ

Исключение связи было вызвано использованием SubList метода ArrayList. 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));
  • 0
    Спасибо, Шерри !!!! Отличная находка. Когда возвращаемые данные не сериализуемы, это вызывает проблемы, и возникающая ошибка очень туманна.
0

Прикрепите источник JDMK к вашей среде IDE, затем установите контрольную точку в HttpSendSocket и запустите ее с включенной отладкой. По крайней мере, в IntelliJ вы можете прикрепить источник библиотеки, пытаясь открыть класс из stacktrace, а затем выбрать ссылку на источник. Не знаю, как этот процесс подходит для других IDE, но я ожидаю, что это будет возможно.

  • 0
    Спасибо, я сделаю это. К вашему сведению, я использую Eclipse. Проблема с настройкой метода точки останова заключается в том, что я не могу заставить эту проблему возникнуть по желанию. Это очень непостоянно. Поэтому я действительно надеялся просто добавить немного диагностики, пересобрать и запустить код из командной строки. Точно так же я посмотрю, смогу ли я использовать предложенную вами технику. Спасибо!
  • 0
    Я все еще ищу, но Eclipse хочет файл jdmkrt.jar, который содержит источник. Как ты это понял?
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню