Канал JSch sftp работает синхронно?

Это то, что я хочу сделать, и я использую для этого JSch:

  • скопировать файл A с сервера S1 на сервер S2
  • когда это будет сделано, выполните некоторую логику (например, отправьте электронное письмо о завершении задачи)

Чего я не знаю:

  • JSch выполняет запись в новом потоке или нет? Что сбивает с толку, так это тот факт, что ChannelSftp реализует Runnable, поэтому потенциально запускается как отдельный поток.

Если он запускает его в отдельном потоке, то я не могу добавить свой код после метода put, но вместо этого нужно потенциально использовать SftpProgressMonitor (может быть?!).

К сожалению, я не смог найти в их документации ничего о том, как будет выполняться вызов put или любых других методов - синхронно или асинхронно.


person Stef    schedule 17.03.2014    source источник


Ответы (1)


Что я сделал, так это отслеживал статус выхода команды, выполняемой в цикле, всякий раз, когда статус равен -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();
person cesarggf    schedule 13.12.2014
comment
В итоге я проверил, был ли файл на сервере с помощью новой команды ssh (я не помню, ждал ли я какое-то время раньше или нет, и у меня больше нет доступа к коду). Если бы это было так, я бы отправил уведомление по электронной почте, иначе я бы попробовал еще раз 3 раза, и в конце концов, если бы его все еще не было, я бы предположил, что это не сработало. Ваше решение звучит хорошо и может быть дешевле. - person Stef; 15.12.2014