Мое приложение на основе 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)
Как я сказал, любые полезные предложения будут оценены.
Исключение связи было вызвано использованием 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));
Прикрепите источник JDMK к вашей среде IDE, затем установите контрольную точку в HttpSendSocket и запустите ее с включенной отладкой. По крайней мере, в IntelliJ вы можете прикрепить источник библиотеки, пытаясь открыть класс из stacktrace, а затем выбрать ссылку на источник. Не знаю, как этот процесс подходит для других IDE, но я ожидаю, что это будет возможно.