2010-06-15 3 views
18

Я пытаюсь решить, стоит ли использовать ProcessBuilder или Commons EXEC,Выбор между Apache Commons Exec или ProcessBuilder

Мои требования в том, что я просто пытаюсь создать процесс-демон, чей стандартный вывод/STDIN/STDERR я делаю не заботясь. Кроме того, я хочу выполнить убийство, чтобы уничтожить этот процесс, когда придет время.

Я использую Java в Linux.

Я знаю, что у обоих есть свои боли и подводные камни (например, если использовать отдельный поток для проглатывания потоков, это может привести к блокировке или взаимоблокировкам, а также закрытию потоков, чтобы не оставлять открытые файлы висящими) и хотел знать, у кого-то есть предложения так или иначе, а также любые хорошие ресурсы для подражания.

+1

Может быть, если вы кратко эти боли и подводные камни ...? – skaffman

+0

См. Изменения выше. – Traker

ответ

8

commons-exec - не самая лучшая библиотека, которую я когда-либо использовал, но она решает самую большую ошибку в вызове Java-процесса, которая правильно обрабатывает/потребляет stdout/sterr. Я использовал ProcessBuilder в прошлом, и это нормально, и commons-exec теперь также отлично подходит для большинства обычных случаев.

1

Если вы хотите использовать процесс демона, возможно, Apache Commons Daemon будет более уместным?

1

Commons Daemon выполняет работу по запуску Java-процесса как демона, но он не делает этого так, как этого можно было бы ожидать. Например, когда стандартная программа C запускает демона (например, apache или sshd), они выполняют некоторые проверки на проверку конфигурации и другие вещи (например, блокировку файла блокировки) перед тем, как развернуть их в фоновом режиме. Apache Commons Daemon - это c-программа, запускающая приложение java и не позволяющая вам вводить проверки работоспособности в код Java AFAIK и, таким образом, ломает то, что я считаю важными средствами демон.

Таким образом, если вы хотите внедрить пусковую установку daemon, которая ведет себя аналогично sshd, apache и т. Д., Тогда я бы предложил commons exec.

7

Библиотека ZT Process Executor является альтернативой Apache Commons Exec. Он имеет функциональные возможности для запуска команд, захвата их вывода, таймаутов настройки и т. Д.

Я еще не использовал его, но он выглядел достаточно хорошо документированным.

Пример из документации: Выполнение команды, перекачка stderr в регистратор, возвращающая выход как строку UTF8.

String output = new ProcessExecutor().command("java", "-version") 
    .redirectError(Slf4jStream.of(getClass()).asInfo()) 
    .readOutput(true).execute() 
    .outputUTF8(); 

Его документация перечисляет следующие преимущества по сравнению с Commons Exec:

  • Улучшенная обработка потоков
    • Чтение/запись в потоки
    • Перенаправление STDERR на стандартный вывод
  • Улучшена обработка тайм-аутов
  • Улучшенная проверка кодов выхода
  • Улучшенные API
    • Один вкладыши для довольно сложных usecases
    • лайнеры, чтобы получить конечный результат процесса в строку
    • Доступ к Process объекта доступного
    • Поддержка асинхронных процессов (Будущее)
  • Улучшено ведение журнала с SLF4J API
  • Поддержка нескольких процессов