Java - MultiThreading - случайный сбой (код выхода 255) при отправке команды CLPPLUS в cmd

Я работаю с данными из нескольких разных баз данных / среды (в данном случае с DB2). Работа носит общий характер, поэтому я хотел бы ускорить процесс, применив один и тот же сценарий к нескольким средам и одновременно объединяя результаты.

Это код, который я должен реализовать для многопоточности.

public static void main(String[] args) throws Throwable {

    ExecutorService es = Executors.newCachedThreadPool();
    es.execute(new MultiThreadDataExtract(dataPoolMap, "env1"));
    es.execute(new MultiThreadDataExtract(dataPoolMap, "env2"));
    es.shutdown();
    es.awaitTermination(1, TimeUnit.HOURS);

}

Это моя утилита командной строки, используемая для отправки команды в CLPPLUS.

public class CommandLineUtil extends TestcaseKeyword {

    Process proc;
    int exitVal;

    public void runCommand(String command) {
        try {
            proc = new ProcessBuilder("cmd.exe", "/c", command).start();
            exitVal = proc.waitFor();
            System.out.println("Exit value: " + exitVal);
        } catch (Exception ex) {
            logger.info(ex.toString());
        }
    }

Наконец, класс Runnable для форматирования команды перед ее отправкой в ​​утилиту командной строки.

public class MultiThreadDataExtract extends PropertiesVariables implements Runnable {

    CommandLineUtil commandUtil = new CommandLineUtil();
    String env;
    Map<String, String> datapool;

    public MultiThreadDataExtract(Map<String, String> datapool, String env) {
        this.env = env;
        this.datapool = datapool;
    }

    @Override
    public void run() {
        tableExtraction(datapool, env); 
    }

    public void tableExtraction(Map<String, String> datapool, String env) {
        //format the command based on the input datapool map 
        //and properties variable from PropertiesVariables and execute it base on a defined enviroment
        //then send the command to the subprocess
        commandUtil.executeScript(command);
    }
}

Это пример команды при использовании CLPPLUS на удаленном сервере DB2:

clpplus id/pwd@1.1.1.1:50000/dbname @pathToSQLScript

Вот где возникает проблема:

Иногда он работает отлично, запустив две командные строки и два подпоследовательности окна clpplus и запустив sql-скрипт.

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

Что я пробовал:

  • Я пробовал запускать простые команды, такие как "эхо-тестирование" или "dir", которые работали нормально (15+ последовательного выполнения)
  • Изучение кода ошибки для DB2 дает сбой этого задания с кодом выхода 255 на хостах выполнения Windows

    • Что мне показалось странным, так это то, что я могу вызывать cmd.exe каждый раз для выполнения более простых команд, поэтому я не думаю, что это проблема с разрешением, как указано в ссылке

Связано ли это с тем, как я управляю созданием своих потоков? Или это вещь CLPPLUS?

Любое понимание будет очень признательно.:)

0 ответов

Другие вопросы по тегам