суббота, 19 февраля 2011 г.

java.lang.Process баги

Хотел бы в очередной раз поругать Java'у. В этот раз по делу :)

Есть такой интерфейс java.lang.Process и класс Runtime, которые позволяют  запускать другие приложения, скажем так. У нас это достаточно частая штука. Скажем даже основная функция (:

Поэтому следующие два взаимодополняющих бага в JVM прочувствовали очень сильно на себе.

Process.waitFor() fails to return. Проблема заключается в том, что waitFor может упасть, если никто не вычитает stream'ы процесса. Я не зря употребил слово _может _, так как это например у нас первый раз появилось спустя несколько месяцев тестирования. Ладно, его типа закрыли, так как можно перед вызовом waitFor прочитать потоки процесса и всё будет хорошо. Ага, только в каком-либо другом, идеальном мире.

"IOException: Stream closed" if more data sent after Process.destroy. Тут мы приходим ко второму багу. Так как если применить выше указанный способ, т.е. запускать процесс, открывать потоки и читать их до завершения у работающего процесса, то в случае если его кто-нибудь kill'нёт, что для ряда процессов у нас нормальное явление, то мы получаем ещё один прекрасный exception при чтении. И этот баг не закрыт.

Да, варианты конечно всегда есть, даже несколько. Можно глотать exception, можно использовать цикл и exitValue, вместо waitFor. Но оба смотрятся по уродски.

Вот такая нелёгкая жизнь у Java программиста :) И я бы Sun Oracle всё бы простил, если бы это происходила на какой-нибудь Windows, так нет, тут всё хорошо, а происходят эти баги на той самой SunOS.

Комментариев нет:

Отправить комментарий