Java -программа, которая называет внешнюю программу, асинхронно ведет себя?

StackOverflow https://stackoverflow.com/questions/19835244

Вопрос

Все,

Первоначально у меня был скрипт оболочки, который назывался SQLLoader (инструмент загрузки данных Oracles).

Проблема заключалась в том, что SQLLOADER принимает простой текстовый пароль в качестве ввода, поэтому я решил построить приложение Java, чтобы вызвать SQLLOADER, внутренне передавая расширенный пароль в строку команды.

например

sqlldr user/pass@dbserver control = ../sqloader.ctl log = sqloader.log data = mydata.csv

Итак, с моей оберткой Java это стало в моем сценарии раковины

java -jar sqlloader.jar sqlloader.ctl mydata.csv

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

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

java -jar sqlloader.jar sqlloader.ctl mydata.csv
echo $?
sleep 20
if [ $? -ne 0 ]
    then
        echo "SQLLoader failed during execution, please check the log : " 
        mv mydata.csv

else
    echo "SQLLoader successfully processed file : "
    mv mydata.csv
fi

Кто -нибудь знает, почему Unix ведет себя таким образом, выполняет ли Java мой sqloAder как другой пользователь/ поток?

Это мой код Java:

    Runtime Rt;
Process Prc;
    Prc = Rt.exec("sqlldr user/decryptedpass@DBServer control=../sqlloader.ctl log=sqlloader.log data=mydata.csv);
system.exit(0);

Я проверил класс времени выполнения, чтобы что -нибудь о том, что это асинхронно, но ничего не мог найти

http://docs.oracle.com/javase/7/docs/api/java/lang/runtime.html

Есть теории или предложения?

Спасибо

Это было полезно?

Решение

Да. Если вы посмотрите на Runtime.exec снова, это укажет, что он запустит новый процесс в указанной среде (например, независимо от текущей «среды» или, как вы ставите его асинхронно). Вы должны использовать Процесс -строитель Чтобы создать Процесс И затем ждите этого процесса, чтобы закончить, прежде чем вызовать System.Exit - что, безусловно, не обязательно. Что-то вроде этого

public static void main(String[] args) {
    // String command = "/usr/bin/sleep 5";
    List<String> command = new ArrayList<String>();
    command.add("c:/cygwin/bin/sleep");
    command.add("5");
    ProcessBuilder pb = new ProcessBuilder(command);
    BufferedReader is = null;
    try {
        System.out.println("Starting command " + command);
        Process p = pb.start();

        int ret = p.waitFor();
        is = new BufferedReader(new InputStreamReader(p.getInputStream()));
        String line;
        while ((line = is.readLine()) != null) {
            System.out.println(line);
        }
        if (ret == 0) {
            System.out.println("Command has completed.");
            System.exit(ret);
        } else {
            System.out.println("Command completed with return code " + ret);
            System.exit(ret);
        }
    } catch (Exception e) {
        System.out.println("Caught Exception " + e.getMessage()
                + " running command " + command);
        e.printStackTrace();
    } finally {
        if (is != null) {
            try {
                is.close();
            } catch (IOException e) {
            }
        }
    }
    System.out.println("COMMAND FAILED");
    System.exit(1);
}

Другие советы

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

Если вы позвоните в Exit () после exec (), Java сделает именно это - выйдет немедленно.

Вот статья, в которой объясняется runtime.exec ошибки: http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html?page=4 (Также рассмотрим другие страницы).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top