Оптимизация дизайна при выполнении вызовов внешних процессов
Мне нужно из процесса Java для вызова внешних процессов / скриптов / команд.
Поскольку этих вызовов будет довольно много, и некоторые из них вернут результат запуска процесса / скрипта, а другие просто запустят его, мне было интересно, если:
- Существует стандартная конструкция, основанная на Java
ProcessBuilder
так что я не разбросал в коде звонкиProcessBuilder
постоянно - Какие оптимизации я могу сделать? Например, имеет ли смысл читать из файлов все команды cli, а не сохранять их, например, как
final String
в коде?
1 ответ
Ваш вопрос немного неопределенный, чтобы написать точный ответ, но у меня есть несколько предложений:
- Оболочки предназначены для связывания команд (конвейер, ожидание и т. Д.) И небольшого количества логики. Оболочки интерпретируются и очень легко обновляются, но должны быть простыми. Они могут быть основной частью вашей системы.
- Написать свой
launch
метод для запуска процесса и захвата stdout и stderr (в двух потоках), чтобы записать журнал вашего драйвера. - Разработайте XML-файл для декларативного указания:
- пути процессов, их аргументы (статические)
- параллелизм и синхронизация между заданиями
- Напишите модель на Java, чтобы отразить модель процесса XML (решение может быть JAXB)
- Добавьте к модели возможность ожидания набора заданий
- Добавить модификаторы в модель для динамического изменения значения аргументов
Если я пытаюсь классифицировать вашу проблему, я думаю, в основном, на Потоке управления.
Для решения большой проблемы вы можете использовать параллелизм: запускать одновременно несколько процессов и ждать завершения всех из них: это фаза рандеву или соединение. Возможно, вы можете запустить удаленную команду для другого сетевого компьютера.
Хорошим примером того, как указать параллелизм в XML-файле, являются файлы сборки ANT:
<parallel>
<wlrun ... >
<sequential>
<sleep seconds="30"/>
<junit fork="true" forkmode="once" ... >
<wlstop/>
</sequential>
</parallel>
Могу ли я предложить вам использовать ANT для решения вашей проблемы без программирования?
Может помочь рисунок желаемого исполнения, с бумагой и ручкой...;-)
Несколько графических приложений могут помочь нарисовать логическую диаграмму потока управления. После этого опубликуйте его здесь, и вы получите более точный ответ, я надеюсь...