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