Создайте многопоточную Java-программу из программы командной строки Windows, spawner не завершится, пока не закончится spawnee. Как я могу предотвратить зависание? - PullRequest
1 голос
/ 17 мая 2010

Короткая версия:

Как я могу запретить порожденному процессу Java в Windows блокировать завершение процесса порождения?

Длинная версия:

Я пытаюсь создать многопоточную Java-программу (Selenium RC, не то, чтобы она имела значение) из программы, запускаемой из командной строки Windows (задача NAnt , опять же, не то, чтобы она имела значение) Я делаю это с помощью команды Windows «Пуск», и порожденный процесс запускается и работает правильно. Процесс нереста получает управление и завершается (NAnt говорит «BUILD SUCCEEDED»), но фактически не выходит из командной строки. Когда порожденный процесс окончательно завершается (может быть через несколько часов), командный процесс возвращается и появляется приглашение командной строки.

Например:

<target name="start_rc">
    <exec program="cmd" failonerror="false" workingdir="${ross.p5.dir}\Tools\selenium\selenium-server-1.0.1" verbose="true">
        <arg value="/C"/>
        <arg value="start"/>
        <arg value="java"/>
        <arg value="-jar"/>
        <arg path="${ross.p5.dir}\Tools\selenium\selenium-server-1.0.1\selenium-server.jar"/>
        <arg value="-userExtensions"/>
        <arg path="${ross.p5.dir}\Tools\selenium\selenium-server-1.0.1\user-extensions.js"/>
        <arg value="-browserSideLog"/>
        <arg value="-log"/>
        <arg value="${ross.p5.dir}\artifacts\selenium.log"/>
        <arg value="-debug"/>
    </exec>
</target>

Производит:

C:\Ross>nant start_rc
NAnt 0.86 (Build 0.86.2898.0; beta1; 12/8/2007)
Copyright (C) 2001-2007 Gerry Shaw
http://nant.sourceforge.net

Buildfile: file:///C:/Ross/ross.build
Target framework: Microsoft .NET Framework 3.5
Target(s) specified: start_rc


start_rc:

     [exec] Starting 'cmd (/C start java -jar C:\p5\Tools\selenium\selenium-server-1.0.1\selenium-server.jar -userExtensions C:\p5\Tools\selenium\selenium-server-1.0.1\user-extensions.js -browserSideLog -log C:\p5\artifacts\selenium.log -debug)' in 'C:\p5\Tools\selenium\selenium-server-1.0.1'

BUILD SUCCEEDED

Total time: 4.1 seconds.

... и ничего, пока я не закрою окно, в котором работает Java, тогда ...

C:\Ross>

Очевидно, что что-то мешает завершить процесс nant, но разве команда Windows START не должна это предотвратить?

Ответы [ 2 ]

2 голосов
/ 17 мая 2010

У вас есть проблема с вашей задачей exec, в которой spawn по умолчанию имеет значение false. Из документации NAnt :

Получает или задает значение, указывающее, следует ли запускать приложение. Если вы порождаете приложение, его вывод не будет зарегистрирован NAnt. По умолчанию false .

В документации Ant (помните, NAnt означает "Не Ant", но все же ...), есть конкретный пример использования параметра spawn в задаче exec:

<property name="browser" location="C:/Program Files/Internet Explorer/iexplore.exe"/>
<property name="file" location="ant/docs/manual/index.html"/>

<exec executable="${browser}" spawn="true">
    <arg value="${file}"/>
</exec>

Когда запускается эта задача браузера, Internet Explorer открывает эту страницу, но сборка продолжается без ожидания вывода или завершения задачи.

0 голосов
/ 17 мая 2010

Я не уверен на 100%, что это то, что вам нужно, но я думаю, что вы хотите javaw вместо java.

Взято из документации Sun JDK 6:

Команда javaw идентична java, за исключением того, что с javaw нет ассоциированного окна консоли. Используйте javaw, когда вы не хотите, чтобы отображалось окно командной строки. В случае запуска запуска по какой-либо причине запуск приложения javaw будет отображать диалоговое окно с информацией об ошибке.

...