Ruby Net :: SFTP обработка прерываний передачи - PullRequest
2 голосов
/ 27 марта 2012

Как обработать прерывание передачи Ruby Net :: SFTP, например, отключение сети?

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

require 'net/sftp'

Net::SFTP.start("testing","root",:timeout=>1) do |sftp|
    begin
        sftp.download!("testfile_100MB", "testfile_100MB")
    rescue RuntimeError =>e
        puts e.message
    end
end

Ответы [ 2 ]

4 голосов
/ 06 ноября 2012

Вы можете создать другой поток, чтобы следить за ходом загрузки и завершать работу приложения, если загрузка не отвечает. Поскольку Net :: SFTP позволяет передавать собственный обработчик методу download!, вы можете настроить поток наблюдателя следующим образом:

class CustomHandler
  def extend_time
    @crash_time = Time.now + 30
  end

  # called when downloading has started
  def on_open(downloader, file)
    extend_time
    downloader_thread = Thread.current
    @watcher_thread = Thread.new{
      while true do
        if Time.now > @crash_time
          downloader_thread.raise "Downloading appears unresponsive. Network disconnected?"
        end
        sleep 5
      end
    }
  end

  # called when new bytes are downloaded
  def on_get(downloader, file, offset, data)
    extend_time
  end

  # called when downloading is completed
  def on_close(downloader, file)
    @watcher_thread.exit
  end
end

И не забудьте передать пользовательский обработчик следующим образом:

sftp.download!(remote_path, local_path, :progress => CustomHandler.new)
0 голосов
/ 29 августа 2012

Класс Net-SFTP зависит от класса Net-SSH для базового соединения.В приведенном выше примере SSH-соединение пытается поддерживать себя, поэтому код продолжает выполняться до тех пор, пока SSH не сочтет его неудачным.Параметр :timeout применяется только к исходному соединению.

...