1

我正在使用Java未来类来实现并行编程。我正在调用 shell 脚本,如下所示。我正在从我的 java 控制器调用以下函数

 String NodeResult=restartNodes(HostName);

在未来类的控制器实现中

 public static String restartNodes(final String hostName){
   ExecutorService executor = Executors.newFixedThreadPool(threadNum);
    List<FutureTask<Integer>> taskList = new  ArrayList<FutureTask<Integer>>();

    // Start thread for the first half of the numbers
    FutureTask<Integer> futureTask_1 = new FutureTask<Integer>(new Callable<Integer>() {
        @Override
        public Integer call() throws Exception {

            restartScript(hostName);


            return SUCCESS;
        }
    });
    taskList.add(futureTask_1);
    executor.execute(futureTask_1);
    return "successfully done";
}

调用脚本的代码是:

 public static void  restartScript(String hostName) {
    SSHExec ssh = null;

    // Wrap the whole execution jobs into try-catch block
    try {
        // Initialize a ConnBean object, parameter list is ip, username,
        // password

        ConnBean cb = new ConnBean(IP_Add, User_Name,
                Password);

        ssh = SSHExec.getInstance(cb);


        CustomTask ct2 = new ExecShellScript("/root/",
                "./restartScript.sh",""+ hostName+"" );

        // Connect to server
        ssh.connect();

        Result res = ssh.exec(ct2);
        // Check result and print out messages.
        if (res.isSuccess) {
            System.out.println("Return code in success: " + res.rc);
            System.out.println("sysout: " + res.sysout);

        } else {

            System.out.println("Return code: " + res.rc);
            System.out.println("error message: " + res.error_msg);
        }
    } catch (TaskExecFailException ex) {
        System.out.println(ex.getMessage());
        ex.printStackTrace();
    } catch (Exception e) {
        System.out.println(e.getMessage());
        e.printStackTrace();
    } finally {
        ssh.disconnect();
    }

 }

我正在调用多个脚本,我希望它们并行执行,但是在执行时我遇到了错误

 com.jcraft.jsch.JSchException: session is down
at com.jcraft.jsch.Session.openChannel(Session.java:752)
at net.neoremind.sshxcute.core.SSHExec.exec(SSHExec.java:164)
at com.controller.UserLoginController.isNodeLive(UserLoginController.java:1620)
at com.controller.UserLoginController$3.call(UserLoginController.java:1724)
at com.controller.UserLoginController$3.call(UserLoginController.java:1)
at java.util.concurrent.FutureTask.run(FutureTask.java:262)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:744)

如果我们使用未来的课程,他们是否有获得 ssh 会话的最大限制,即(并发会话,因为我将执行 5 个这样的具有不同目的的脚本,我希望它们都并行运行。)

4

0 回答 0