Proc.wait

Тема в разделе "Lotus + Java + LS2J", создана пользователем allex, 22 сен 2011.

  1. allex

    allex Гость

    Имеется
    <div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">код</div></div><div class="sp-body"><div class="sp-content">
    Код (Text):
    String cmd[] = { "c:\\Program Files (x86)\\LibreOffice 3.4\\program\\soffice.exe","i:\\Бланк.odt" };
    ProcessBuilder pb = new ProcessBuilder(cmd);
    pb.redirectErrorStream(true);
    try {
    Process p = pb.start();
    String s;
    // read from the process's combined stdout & stderr
    BufferedReader stdout = new BufferedReader (
    new InputStreamReader(p.getInputStream()));
    while ((s = stdout.readLine()) != null) {
    System.out.println(s);
    }
    System.out.println("Exit value: " + p.waitFor());
    p.getInputStream().close();
    p.getOutputStream().close();
    p.getErrorStream().close();
    } catch (Exception ex) {
    ex.printStackTrace(System.out);
    }
    который при компиляции и выполнении в консоли отрабатывает как надо, но ....

    при компиляции и выполнении этого же кода (находящегося в библиотеках базы) через бридж LS2J не хочет ждать .waitFor()

    Почему существует разница в выполнении одного и того же кода ?
     
  2. nvyush

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    Некоторое время назад мучился подобным вопросом, победить не смог. Видимо у потока ls своя жизнь, у потока java — своя...
     
  3. allex

    allex Гость

    А вот если этот код в агенте замутить, то работает отлично.
    Придетс подшаманить ...
     
  4. VladSh

    VladSh начинающий
    Lotus team

    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    Ждёт ли из LS-агента через LS2J? Получилось?
     
  5. VladSh

    VladSh начинающий
    Lotus team

    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    Кстати да, из агента ждёт. Но есть неприятный трабл..
    Задача: обновление некоторого ПО, к dll которого подключаемся из LS обычными декларациями.
    Сначала я подключаю эту библу, где декларации функций dll и вызываю функцию инициализации, чем определяю, если ли вообще эти dll, и если есть, то стоит ли их обновлять.
    После этого я грохаю объект, который инициализировал и через LS2J и waitFor запускаю инсталятор. При установке получаю сообщение, что dll не может быть заменена, т.к. сейчас занята.
    Тот же результат (сообщение о занятости) получаю, если в цикле "засыпаю" на 1 сек и пытаюсь удалить файл инсталятора (его надо удалить после обновления).
    Работает только когда вызываю обычный Shell, т.е. скрипт (агент) сразу же завершает работу отпуская задекларированные и проинициализированные в подключаемой библе dll (то, что я перед запуском инсталятора делаю Delete объекту, содержащему вызовы функций из dll, - по барабану).
    Интересны сообращения комьюнити, как обойти эту ситуёвину /проверка инициализации в "отдельном потоке" через Execute в голову приходила, но не хотелось бы так уж заморачиваться, т.к. работа с dll через Execute особо радости не приносит.../.
     
  6. VladSh

    VladSh начинающий
    Lotus team

    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    Решил разбивкой на 2 агента:
    1 - вызов функции инициализации, для определения, если ли вообще эти dll.
    2 - загрузка и установка.
    Первый агент, вызывая в конце кода второго, сам завершается, чем "отпускает" dll'и.
     
  7. VladSh

    VladSh начинающий
    Lotus team

    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    На Win7, где нет прав администратора, код на Java (через LS2J), запускающий exe'шник, "сбрасывается".
    Если запустить вручную, то вылетает окно "Разрешаете ли запустить этот файл?.." Если из кода, то ничего не происходит. Интересно, каким образом можно запустить exe'шник из Java, чтобы вылетело это окно и всё дальше нормально отработалось?

    P.S. К стати, с "отпусканием" dll и waitFor() тоже не всё ясно. На одних компах работает, на других нет.. Дома Win7 x64 (правда с админ-правами) и любая из 8.5.x-версий Лотуса - всё работает, даже с одним агентом, и dll отпускает... и есть куча машин x32, где не работает..
     
  8. VladSh

    VladSh начинающий
    Lotus team

    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    Ещё одна смежная тема.
    Пытаюсь сделать так, чтобы код не клинил Клиента.
    Если запускать с помощью bat, js, vbs, то всё работает отлично - создаётся новый процесс от ОС, не влияющий на мой основной процесс. Вроде бы всё хорошо, но неохота ещё париться с этими "командными" файлами.
    Пробую создать отдельный процесс:
    <div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">типа того</div></div><div class="sp-body"><div class="sp-content"><!--shcode--><pre><code class='java'> public static boolean exec(String[] cmd, boolean bWait) {
    Process process = null;
    Runtime runtime;
    try {
    runtime = Runtime.getRuntime();
    process = runtime.exec(cmd);
    if (bWait)
    process.waitFor();

    return true;
    }
    catch (InterruptedException ei) {

    }
    catch (Exception e) {

    }
    finally {
    if (process != null)
    process.destroy();
    runtime = null;
    }
    return false;
    }

    // стартуем асинхронно
    public static void execA(final String[] cmd, final boolean bWait) {
    new Thread(new Runnable() {
    public void run() {
    exec(cmd, bWait);
    }
    }).start();
    }
    }[/CODE]но вываливается:
    <div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">ошибка</div></div><div class="sp-body"><div class="sp-content">
    Как я понял, сделать это нам не дадут? :(
     
Загрузка...

Поделиться этой страницей