2008-09-26 3 views
2

Я запускаю Хадсона в качестве службы Windows через Tomcat без участия рабов. Последний шаг сборки в задании - это командный файл, который вызывает некоторый Java-код. Код использует инструмент командной строки PostgreSQL psql (через Runtime.exec()) для создания базы данных на локальном компьютере и, в конечном итоге, запускает некоторые тесты против нее.Работа Хадсона зависает в Runtime.exec

Задача будет развиваться до этой точки, а затем вешать бесконечно, не создавая базу данных. Если я запускаю командный файл из командной строки, он отлично работает. Я не думаю, что http://hudson.gotdns.com/wiki/display/HUDSON/Spawning+processes+from+build применяется, так как процесс, порожденный, даже не кажется, что он начинает выполняться, но я новичок в этом, поэтому, пожалуйста, дайте мне знать, если я ошибаюсь.

Редактировать @anjanb: Единственная цель командного файла - вызвать код Java, и единственный вход пользователя передается как аргументы командной строки, которые, как я вижу, идут непосредственно через вывод консоли сборки.

Проводник процесса показывает, что psql запускается, но это, очевидно, не выполняется, так как первая команда psql задана, это создать новую базу данных, но этого не происходит.

Редактировать 2: У меня есть несколько советов из списка рассылки пользователей Hudson, я попробую их в понедельник и отчитаюсь.

Редактировать 3: Java-код уже потреблял выходные потоки, я использовал эту статью при разработке кода. Я не могу понять, что происходит, поэтому я перерабатываю код для использования JDBC для создания базы данных вместо того, чтобы полагаться на psql и Runtime.exec()

ответ

0

Существует вероятность того, что программа ждет на некоторый ввод пользователя. Если служба не настроена на прием пользовательского ввода, она будет висит.

Вы можете попробовать, настроив службу, чтобы разрешить использовать USER INPUT (GUI) - это может помочь.

Кроме того, вы можете запустить Sysinternals ProcessExplorer и ProcessMonitor - они смогут узнать, где остановлена ​​работа .BAT.

3

Вы читаете результаты процесса? Если он производит больше выходных данных, чем могут обрабатывать буферы ОС, вам необходимо их прочитать ...

Кроме того, некоторые процессы ждут завершения ввода. Попробуйте вызвать process.getInputStream(). Close() после запуска процесса.

Возможно, эта статья также интересна. Это называется «Когда Runtime.exec() не будет»: http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html?page=2

+0

Это отличный ресурс, я использовал его при написании самого кода. Он висел, но, по крайней мере, начал создавать БД, в отличие от этого. – rjohnston 2008-09-27 01:22:44

Смежные вопросы