Эквивалент блока сценариев запуска-задания Powershell в Java-ошибке с Callable / Future - PullRequest
0 голосов
/ 04 октября 2019

Привет всем новичкам в Powershell , вот так.

Я хочу взять приведенный ниже код и преобразовать его в Java, чтобы мне не пришлось запускать отдельный Сценарий Powershell вне моей программы, когда он выполняется.

[string] $wspaceDir         = "C:\Temp\loadDir",
[string] $scmLoc            = "C:\Local Apps\IBM\SDP\scmtools\eclipse\scm.exe",
[string] $portNumForDaemon  = "61938"

start-job -scriptblock {
    Set-Location "$($args[1])"
    Write-Host "Starting Daemon on port $args[2]" -foregroundcolor "Yellow"
    &"$($args[0])" "daemon" "start" "$($args[1])" "--port" $args[2]
} -ArgumentList $scmLoc, $wspaceDir, $portNumForDaemon

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

В Java я пытался имитировать, что:

private static String portNumForDaemon  = "61938";
private static String scmLoc            = "C:\\Local Apps\\IBM\\SDP\\scmtools\\eclipse\\scm.exe";
private static String wspaceDir         = "C:\\TempRQM";

public static void blah() {
    ExecutorService pool = Executors.newSingleThreadExecutor();
    ProcessBuilder processBuilder = new ProcessBuilder();
    processBuilder.command("cmd.exe", "/c", scmLoc + " daemon start " + wspaceDir + " --port " + portNumForDaemon);

    try {

        Process process = processBuilder.start();

        System.out.println("process ping...");
        ProcessReadTask task = new ProcessReadTask(process.getInputStream());

        List<String> supplierNames = new ArrayList<String>();
        Future<list<string>> future = pool.submit(task);

        // no block, can do other tasks here
        System.out.println("process task1...");
        System.out.println("process task2...");

        List<string> result = future.get(5, TimeUnit.SECONDS);
        for (String s : result) {
            System.out.println(s);
        }

    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        pool.shutdown();
    }                
}

private static class ProcessReadTask implements Callable<list<string>> {
    private InputStream inputStream;

    public ProcessReadTask(InputStream inputStream) {
        this.inputStream = inputStream;
    }

    @Override
    public List<string> call() {
        return new BufferedReader(new InputStreamReader(inputStream))
            .lines()
            .collect(Collectors.toList());
    }
}

И сколько бы я ни хотел выполнить это, я получаю сообщение об ошибке на всех орудиях Callable , Future .

Я не уверен, правильно ли я это делаю или нет. Я даже не знаю наверняка, что это эквивалентно тому, что делает Powershell ?

И Powershell / Java гуру было бы здорово выручить меня!

...