2016-10-26 2 views
0

Я использую два узла, который запускает вычисления из IDE (Intellij IDEA) и другой, который уже запущен на консоли (удаленная отладка включена). Я отлаживаю оба из IDE.PrintWriter mystery in Ignite

Я не использую peerClassLoading, я поместил jar в libs из консольного узла.

Существует строка кода: System.out.println(x); - который печатает хорошо в обоих. Но следующие строки:

getPrintWriter().println(x); 
getPrintWriter().flush(); 

Работает только на узле, запущенном из среды IDE. PrintWriter обертывает System.out. Консольный узел бросает IOException - «дескриптор файла недействителен» во время флеша.

Вот скриншот StackTrace:

enter image description here

и вот соответствующая часть кода с узлом консоли:

enter image description here


По предложению, Я перезагрузился, и проблема была решена. Вот скриншот:

enter image description here


сериализации Контекст

Вот часть кода, который запускает вычисление воспламеняют:

enter image description here

Для узел на консоли JVM, ConsoleClient получает seriali zed и т. д. содержащиеся классы (команды, слушатели и их авторы и т. д.). В списке clients все объекты ConsoleClient имели своих авторов печати в качестве оберток System.out, поэтому в идеале заметный блок в runnable не нужен. Обратите внимание: если этот отмеченный блок удален, узлы IDE печатаются правильно, но не консольный узел.

+0

Можете ли вы показать полный след? –

ответ

1

Этот PrintWriter пытается делегировать FileOutputStream, так что это либо не System.out внизу, либо System.out заменено. Ignite никогда не делает этого, поэтому проблема не связана с этим. Вы должны проверить код getPrintWriter() и убедиться, что System.out - это консольный писатель, который вы ищете.

+0

Сброс записи для печати решил проблему (см. Скриншот в вопросе редактирования). Тем не менее, я до сих пор не понимаю, как процесс сортировки (слушатель изначально был создан в процессе IDE, но выполняется на консольном JVM) создал не нулевой, но другой печатный редактор. Я понимаю, что я не должен зависеть от сериализации печатающего устройства, поскольку он является системным (http://stackoverflow.com/q/27731969/225866), но если бы вы могли указать некоторые указатели на процесс сериализации, используемый в Ignite, и как я могу копать в него через отладчик, это было бы здорово. – Susanta

+0

Похоже, это происходит в вашем классе, нет? Как вы думаете, почему это связано с протоколами сериализации Ignite? –

+0

Я редактировал вопрос, добавляя контекст сериализации. – Susanta