Java JSch sftp通道是否同步运行?

Java JSch sftp通道是否同步运行?,java,asynchronous,sftp,synchronous,jsch,Java,Asynchronous,Sftp,Synchronous,Jsch,这就是我想要做的,我使用JSch: 将文件A从服务器S1复制到服务器S2 完成后,执行一些逻辑操作(例如,发送一封关于任务完成的电子邮件) 我不知道的是: JSch是否在新线程中进行写操作?令人困惑的是,ChannelSftp实现了Runnable,因此可能作为单独的线程运行 如果它在单独的线程中运行,那么我不能在put方法之后添加代码,但可能需要使用sftprogressmonitor(可能?!) 不幸的是,我在他们的文档中找不到任何关于如何运行对put或任何其他方法的调用的信息-同步

这就是我想要做的,我使用JSch:

  • 将文件A从服务器S1复制到服务器S2
  • 完成后,执行一些逻辑操作(例如,发送一封关于任务完成的电子邮件)
我不知道的是:

  • JSch是否在新线程中进行写操作?令人困惑的是,ChannelSftp实现了Runnable,因此可能作为单独的线程运行
如果它在单独的线程中运行,那么我不能在
put
方法之后添加代码,但可能需要使用
sftprogressmonitor
(可能?!)


不幸的是,我在他们的文档中找不到任何关于如何运行对
put
或任何其他方法的调用的信息-同步或异步。

我所做的是监视循环中执行的命令的退出状态,每当状态为-1(表示它仍在运行)时,我就休眠当前线程,为了安全起见,在抓握达到时间限制时最好打断,但这取决于你自己

    final JSch jsch = new JSch();
    final Session sessionJSH = jsch.getSession(user, host, 22);
    sessionJSH.setPassword(pwd);
    final Hashtable configJSH = new Hashtable();
    configJSH.put("StrictHostKeyChecking", "no");
    sessionJSH.setConfig(configJSH);
    sessionJSH.connect();
    final Channel channel = sessionJSH.openChannel("exec");
    ((ChannelExec) channel).setCommand(command);
    channel.connect(0);
    // we'll hold it until 30 minutes = 30m*60s*1000ms/300ms = 6000 times
    int i = 0;
    while (channel.getExitStatus() == -1 && i < 6000) {
        log.debug("Exit status" + channel.getExitStatus());
        Thread.sleep(300);
        i++;
    }
    log.info("Exit status" + channel.getExitStatus());
    channel.disconnect();
    sessionJSH.disconnect();
final JSch JSch=new JSch();
最终会话sessionJSH=jsch.getSession(用户,主机,22);
sessionJSH.setPassword(pwd);
final Hashtable configJSH=new Hashtable();
configJSH.put(“StrictHostKeyChecking”、“no”);
setConfig(configJSH);
connect();
最终通道=sessionJSH.openChannel(“exec”);
((ChannelExec)channel).setCommand(command);
通道连接(0);
//我们将保持30分钟=30m*60s*1000ms/300ms=6000次
int i=0;
而(channel.getExitStatus()=-1&&i<6000){
log.debug(“退出状态”+channel.getExitStatus());
睡眠(300);
i++;
}
log.info(“退出状态”+channel.getExitStatus());
通道断开();
sessionJSH.disconnect();

我最后做的是用一个新的ssh命令检查文件是否在服务器上(我不记得之前是否等待了一段时间,也不记得我再也不能访问代码了)。如果是的话,我会发送电子邮件通知,否则我会再试三次,最后如果它仍然不存在,我会认为它不起作用。您的解决方案听起来也不错,而且可能更便宜。