JDK 6: есть ли способ запустить новый процесс Java, который выполняет метод main указанного класса - PullRequest
1 голос
/ 19 июня 2010

Я пытаюсь разработать приложение, которое непосредственно перед завершением должно запустить новый процесс-демон для выполнения основного метода класса.

Мне требуется, чтобы после завершения работы основного приложения процесс-демон все ещебыть в процессе выполнения.

Это хранимая процедура Java, работающая на БД Oracle, поэтому я не могу использовать Runtime.exec, потому что не могу найти класс java из оболочки операционной системы, потому что он определен в структурах базы данных.файлов файловой системы.

В частности, необходимо, чтобы во время сеанса удаленной базы данных я мог

вызывать первый java-метод, который запускает процесс демона и выходит из него.процесс в состоянии выполнения

, а затем (после запуска процесса-демона и управления сеансом, потому что последний вызов завершен) последовательно

вызывает метод, который связывается с процессом-демоном (который в итоге завершается приконец общения)

Возможно ли это?

Спасибо

Обновление

Моя точная потребность - создать и загрузить (достигнув наилучших результатов) большой текстовый файл в базу данных, предполагая, что хост не 'у меня нет служб передачи файлов из клиентского приложения Java JDK6, подключающегося к базе данных Oracle 11gR1 с помощью драйвера oci JDBC-11G.

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

Поэтому я подумал о создании ServerSocket на БД с первым вызовом, а затем подключился к нему и установил передачу данных.с прямым и быстрым общением.

Проблема, с которой я столкнулся, возникает из-за того, что java-процедура, которая создает ServerSocket, не может выйти и оставить выполняющийся поток / процесс, прослушивающий этот сокет и клиент, чтобы убедиться, что ServerSocket был создан, можетне запускаю отдельный поток для обработки остальной части задания.

Надеюсь, что все будет ясно

Ответы [ 3 ]

1 голос
/ 19 июня 2010

Я был бы удивлен, если бы это было возможно.По сути, вы сможете насыщать компьютер с сервером БД неопределенным числом процессов-демонов.

Если такая возможность возможна, метод, вероятно, будет зависеть от Oracle.

Возможно, вы могли бы достичь желаемого эффекта, используя триггеры базы данных или другие подобные возможности базы данных, управляемые событиями.

Я бы порекомендовал объяснить точную проблему, которую вы пытаетесь решить, зачем вам демон?Мой инстинкт состоит в том, что попытка управлять жизнью вашего демона станет ужасно сложной.Вам, возможно, придется столкнуться с такими проблемами, как предотвращение запуска двух экземпляров, неожиданное завершение работы демона, выключение демона при необходимости обслуживания.Подобные вещи могут стать очень запутанными.

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

0 голосов
/ 19 июня 2010

Способ запуска подпроцессов в Java - Runtime.exec() (или его более удобная оболочка, ProcessBuilder).Если это не сработает, вы SOL, если вы не можете использовать собственный код для реализации эквивалентной функциональности (задайте другой вопрос здесь, чтобы узнать, как запускать подпроцессы на уровне C ++), но это будет по крайней мере каксклонны к ошибкам при использовании стандартных методов.

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

0 голосов
/ 19 июня 2010

Создайте еще один jar для вашего другого класса Main, и в вашем главном приложении вызовите jar с помощью метода Runtime.getRuntime (). Exec (), который должен запускать внешнюю программу (другую JVM), выполняющую ваш другой класс Main.

...