Запуск сценариев Unix в Java EE env? - PullRequest
1 голос
/ 28 января 2010

Может ли кто-нибудь поделиться своим опытом вызова сценариев Unix из среды Java EE, сервлета или EJB? Обратите внимание, что эти сценарии должны вызываться для обработки в реальном времени, а не для автономной обработки.

Ответы [ 3 ]

0 голосов
/ 28 января 2010

Порождение процессов из контейнера Java EE, вероятно, не является правильным способом для этого. Если это сценарии оболочки, они не будут переносимыми. Если вы хотите использовать поддержку транзакций, сценарии можно переписать как Jobs, используя Quartz Scheduler . Это более вероятный способ Java EE делать такие вещи.

РЕДАКТИРОВАТЬ: с вашими требованиями, добавленными в комментарии, это должно работать

Process process = new ProcessBuilder(command).start();

Подробнее здесь

обратите внимание, что если вы используете сценарии и / или каналы (без собственных исполняемых файлов), вы должны включить оболочку для вызова команды (и настройки каналов)

0 голосов
/ 02 февраля 2010

Одной из возможностей может быть написание небольшого приложения, которое прослушивает очередь JMS и вызывает сценарии. Таким образом, выполнение скрипта отделено от сервера приложений, поэтому не сталкивается ни с какими спецификационными ограничениями.

0 голосов
/ 28 января 2010

Самая большая проблема, с которой вы столкнетесь, - это большой объем памяти сервера приложений, когда вы выполняете форк для запуска скрипта, вы вполне можете исчерпать память и потерпеть неудачу. Когда вы разветвляетесь, система должна сделать полную копию исполняемого образа. Он не делает физическую копию, но он должен делать виртуальную. Итак, если у вас большая куча Java EE, например 4G реальной памяти (т.е. не только куча Java, общий размер процесса), то вам потребуется дополнительный «свободный» 4G реальной памяти и / или Swap, чтобы вилка имела достаточно виртуальное пространство произойдет.

Да, вы собираетесь немедленно выполнить команду sh или какую-либо другую команду, которая не будет поглощать миллиард ресурсов. Но система не может этого знать, и поэтому ей нужно действовать так, как будто ей придется запускать две копии вашего контейнера Java EE одновременно, даже на наносекунду.

Если у вас нет ресурсов для форка, форк завершается неудачей.

Если вам не хватает места, то вы можете создать маленького демона мини-запуска. Затем вместо того, чтобы ваше приложение Java EE разветвляло процесс, вы просто открываете сокет для своего демона, и ИТ разветвляет процесс. Очевидно, ожидается, что этот маленький демон потребляет гораздо меньше ресурсов, чем ваш контейнер, поэтому его стоит раскошелиться.

Демон может быть простым: взять командную строку для выполнения через сокет и просто выполнить то, что он получает (естественно, небезопасно, но ...), или простой rpc с кодом команды и некоторыми аргументами. Все, что подходит для вашего проекта. Вы можете написать это на Java, языке сценариев (Python, Perl, Ruby), что угодно. Множество способов сделать это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...