我正在使用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 个这样的具有不同目的的脚本,我希望它们都并行运行。)