1

並列プログラミングを実現するために Java future クラスを使用しています。以下に示すように、シェルスクリプトを呼び出しています。Javaコントローラーから以下の関数を呼び出しています

 String NodeResult=restartNodes(HostName);

future クラスのコントローラ実装で

 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