JSch sftp频道同步运行?

时间:2014-03-17 05:41:17

标签: java asynchronous sftp synchronous jsch

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

  • 将文件A从服务器S1复制到服务器S2
  • 完成此操作后,请执行一些逻辑(例如,发送有关任务完成的电子邮件)

我不知道的是:

  • JSch是否在新线程中写入?令它混淆的是ChannelSftp实现了Runnable这一事实,因此可能作为一个单独的线程运行。

如果它确实在单独的线程中运行它,那么我无法在put方法之后添加我的代码,但需要使用SftpProgressMonitor代替(可能是?!)。

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

1 个答案:

答案 0 :(得分:2)

我所做的是监视循环中执行的命令的退出状态,只要状态为-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();