написание системы в netbeans rcp - не уверен, что это важно, я просто не доверяю rcp
Мы приближаемся к кризису в нашей системе, и продолжает появляться следующая ошибка (иногда это происходит через 10 минут, иногда выполняется в течение 2 дней, а затем происходит, что наводит меня на мысль, что это может быть ошибка многопоточности)
у нас есть класс чтения сокетов, который реализует runnable - вот пример кода
@Override
public void run() {
while (!Thread.interrupted()) {
try {
/*
* can't display actual code
* reads data through socket and passes stream to a new handler class
* which uses reflection to create new object based off socket stream
* (none of this happens in a separate thread)
* (we're not holding a reference to the handler class - a new one is
* -created every iteration)
*
* at some point during the creation of this object, we get a socket
* closed exception happening at SocketInputStream.socketRead()
*/
} catch (Exception ex) {
cleanup();
}
}
}
я ожидаю, что исключение сокета должно быть просто перехвачено блоком catch и выполнена очистка
что в итоге происходит вместо этого, я получаю видимую трассировку стека (появляется в окне необработанных исключений netbeans и отображается в консоли) для закрытого сокета java.net.SocketException - я не могу опубликовать трассировку стека из-за требований клиента
Что еще странно, так это то, что в фактическом классе обработчика ввода сокета у нас есть следующий метод (это метод, из которого фактически выдается исключение)
public Abstract________ new________(Class<? extends Abstract________> clazz,
DataInput input) {
...
try {
// reflection code here
} catch (Exception ex) {
LOG.error("...");
throw new RuntimeException(ex);
}
...
}
если я попытаюсь вручную вызвать исключение java.net.SocketException после блока catch, то исключение будет считываться как java.lang.RuntimeException: java.net.SocketException исключение: сокет закрыт
однако трассировка стека, которую мы получаем случайным образом, просто говорит java.net.SocketException: сокет закрыт
это наводит меня на мысль, что в нашем классе обработки потоков сокетов даже не перехватывается исключение для начала.
Кто-нибудь знает, почему это может происходить ???
также - мне очень жаль, что я не могу опубликовать реальный код, я не пытаюсь быть загадочным
Пока что мне интересно только одно - я немного знаком с рефлексией, но не очень хорошо - когда я выкидываю исключение вручную, оно всегда ловится блоком try catch - если исключение выдается из чего-то в рефлексии есть ли какой-нибудь способ, которым это могло бы нарушить контракт «поймать улов» - я не понимаю, почему это так, но я имею в виду, я честно не уверен и цепляюсь за соломинку в этот момент
я получил разрешение на публикацию отредактированной трассировки стека
в классе MessageReader нет отдельного потока - метод newMessage - это место, где исключение перехватывается, помещается в RuntimeException и генерируется - ____Reader - это средство чтения сокетов с циклом while
оба метода отображаются в трассировке стека
не уверен, поможет ли это