Запустите удаленный исполняемый файл из Webapp - PullRequest
0 голосов
/ 11 февраля 2019

ОК, после нескольких попыток я хотел бы перефразировать мой вопрос:

"Я разработал веб-приложение с Angular 5 (внешний интерфейс), подпружиненной загрузкой (внутренний интерфейс) И Java 8

Следующим шагом является запуск партнерского программного обеспечения, установленного на удаленном сервере, из интерфейса. Это программа .exe с некоторыми параметрами, но я хочу протестировать, просто запустив putty

Мой класс java (с помощью @Ankeshответ)

@Service
public class DictService extends CoreServices {

   public ApiResponse<?> launch(String idWS, String ipp, String nom, String prenom, String ddn) {

    try {
        boolean isWindows = System.getProperty("os.name")
                  .toLowerCase().startsWith("windows");

        String path = "C:\\klinck\\PuTTY\\putty.exe";
        ProcessBuilder builder = new ProcessBuilder();
        if (isWindows) {
            // builder.command("cmd.exe", "/c", "dir");
             builder.command("cmd.exe", "/c", path);
        } else {
            // this is for bash on linux (can be omitted)
            builder.command("sh", "-c", "ls");
        }
        System.out.println(builder);
        // builder.directory(new File(System.getProperty("user.home")));
        // Start the process here
        // Redirect the errorstream
          builder.redirectErrorStream(true);
          System.out.println(""+builder.redirectErrorStream());
        System.out.println("before start");
        Process process = builder.start();
        System.out.println("after start");
        // Follow the process to get logging if required
        StreamGobbler  streamGobbler = 
          new StreamGobbler (process.getInputStream(), System.out::println);

        //Submit log collection to and executor for proper scheduling and collection of loggs
        System.out.println("before executors submit");
        Executors.newSingleThreadExecutor().submit(streamGobbler);

        // Collect exit code
        System.out.println("before waitFor");
        int exitCode = process.waitFor();
        System.out.println("after waitFor");
        // validate if the appliction exited without errors using exit code
        assert exitCode == 0;

    } catch (Exception ure) {
        return new ApiResponse<>(false, "Une erreur interne est survenue. Merci de contacter le support", null, 0);
    }

    return new ApiResponse<>(true, null, null, 0);
}
private static class StreamGobbler implements Runnable {
    private InputStream inputStream;
    private Consumer<String> consumer;

    public StreamGobbler(InputStream inputStream, Consumer<String> consumer) {
        this.inputStream = inputStream;
        this.consumer = consumer;
    }

    @Override
    public void run() {
        System.out.println("StreamGlobber run");
        new BufferedReader(new InputStreamReader(inputStream)).lines()
          .forEach(consumer);
    }
}

}

Процесс запущен, но графический интерфейс не отображается.

enter image description here

Я заметил, что этот процесс блокирует файлы журнала tomcat (stderr и stdout)

Я видел, что это возможно: Лучший способ запустить внешний процесс из веб-службы Java? Выполнение внешнегоJava-программа из веб-приложения

Но мне не удается адаптировать этот код.

Вот журнал:

java.lang.ProcessBuilder@7b1ead05
true
before start
after start
before executors submit
before waitFor
StreamGlobber run

Кажется, процесс запущен.

Я не понимаю .... Как я могу решить это?

1 Ответ

0 голосов
/ 11 февраля 2019

Вы можете использовать свой SpringBoot бэкэнд для достижения этой цели.

В java ProcessBuilder класс может помочь вам запустить команду (которая запустит ваш executable).Здесь мы запускаем cmd.exe, который доступен по системному пути.

ProcessBuilder builder = new ProcessBuilder();
if (isWindows) {
    builder.command("cmd.exe", "/c", "dir");
} else {
    // this is for bash on linux (can be omitted)
    builder.command("sh", "-c", "ls");
}
builder.directory(new File(System.getProperty("user.home")));
// Start the process here
Process process = builder.start();

// Follow the process to get logging if required
StreamGobbler streamGobbler = 
  new StreamGobbler(process.getInputStream(), System.out::println);

//Submit log collection to and executor for proper scheduling and collection of loggs
Executors.newSingleThreadExecutor().submit(streamGobbler);

// Collect exit code
int exitCode = process.waitFor();
// validate if the appliction exited without errors using exit code
assert exitCode == 0;

Ссылка: https://www.baeldung.com/run-shell-command-in-java

...