2012-03-27 7 views
2

Wie Ruby Net :: SFTP Übertragungsunterbrechung wie Netzwerktrennung umgehen?Ruby Net :: SFTP-Transfer-Interrupt-Behandlung

Wenn ich meinen Beispielcode ausführe und das Netzwerk während der Übertragung getrennt wird, läuft die Anwendung weiter.

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 
+0

In einer Situation, wenn Ihr Programm als Skript aufgerufen wird, ist dies selten ein Problem, net :: sftp hat Standard-Timeout, aber es ist für die Anfangsphase der Verbindung, denke ich. Wenn also die bestehende Verbindung aufhört, müssen Sie sie vom übergeordneten Thread oder einem anderen Prozess (Kindermädchen) unterbrechen. Wahrscheinlich der einfachste Weg, um dieses Problem zu umgehen. Wenn Sie eine lange laufende Anwendung als Threading haben, ist dies die beste Lösung. – Istvan

Antwort

0

Die Net-SFTP-Klasse ist abhängig von der Net-SSH-Klasse für die zugrunde liegende Verbindung. Im obigen Beispiel versucht die SSH-Verbindung, sich selbst zu verwalten. Daher wird der Code weiterhin ausgeführt, bis er von SSH als fehlgeschlagen eingestuft wird. Der Parameter :timeout gilt nur für die erste Verbindung.

4

Sie können einen weiteren Thread erstellen, um den Download-Fortschritt zu verfolgen und die Anwendung zum Absturz zu bringen, wenn der Download nicht mehr reagiert. Da Net :: SFTP Sie in einem benutzerdefinierten Handler zum download! Methode passieren lässt, können Sie den Beobachter Faden wie diese ein:

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 

Und vergessen Sie nicht, wie dies in der benutzerdefinierten Handler weitergeben müssen:

Verwandte Themen