2017-09-02 1 views
2

Ich versuche zum Hochladen von Dateien kontinuierlich zu SFTP-Server unter Verwendung von 5 Threads in Java, bei Dateien korrekt Programm Uploads starten, aber nach einiger ZeitUnknown occures wenn SFTP Anschluss Java mit

alle Themen wirft Unknown, wenn sie versuchen zu schaffen neue Sitzung und Exception weiter bis zu 5 bis 10 Minuten, nach einiger Zeit Programm normal funktioniert, ich in der Lage kann nicht zu finden, was für diese Ausnahme verursacht,

Dies ist der Code für den Anschluss von sFTP,

 JSch jsch = new JSch(); 
     jsch.setKnownHosts(host_file); 
     session = jsch.getSession(SFTPUSER,SFTPHOST,SFTPPORT); 
     session.setPassword(SFTPPASS); 
     java.util.Properties config = new java.util.Properties(); 
     config.put("StrictHostKeyChecking", "no"); 
     session.setConfig(config); 
     session.connect(); 
     channel = session.openChannel("sftp"); 
     channel.connect(); 
Ausnahme

:

at td.bdops.clupload.CARUpload.uploadZip(CARUpload.java:398) 
    at td.bdops.clupload.CARUpload.uploadZip(CARUpload.java:398) 
Caused by: java.net.UnknownHostException: sftp.opsbank2-prod.tio.systems 
    at java.net.AbstractPlainSocketImpl.connect(Unknown Source) 
    at java.net.PlainSocketImpl.connect(Unknown Source) 
    at java.net.SocksSocketImpl.connect(Unknown Source) 
    at java.net.Socket.connect(Unknown Source) 
    at java.net.Socket.connect(Unknown Source) 
    at java.net.Socket.<init>(Unknown Source) 
    at java.net.Socket.<init>(Unknown Source) 
    at com.jcraft.jsch.Util.createSocket(Util.java:343) 
    at com.jcraft.jsch.Session.connect(Session.java:215) 
    at com.jcraft.jsch.Session.connect(Session.java:183) 
    at td.bdops.util.FTPUtility.uploadAWSFTP(FTPUtility.java:227) 
    at td.bdops.util.FTPUtility.uploadAWSFTP(FTPUtility.java:247) 

kann jemand bitte erklären Sie mir, was ist die Ursache dieser Fehler

+0

Jede Chance, dass der Ziel-Host ausfällt? – Xvolks

+0

Ich vermute, einige geöffnete Sockets wurden nicht richtig geschlossen. Ich schlage vor, dass Sie das Programm zuerst überprüfen/ändern. Wenn der Fehler immer noch auftritt, können Sie vielleicht versuchen, die Lösung in https://stackoverflow.com/q/30207301 –

+0

@ Xvolks nein, noch kann ich Host über FileZilla zugreifen, wenn diese Ausnahme auftritt. – radhakrishnan

Antwort

2

Das Problem ist nicht ein JSch spezifische ist, wie Sie mit dem Stacktrace sehen können, weil es innerhalb einer Klasse geschieht des java.net-Pakets und nicht innerhalb von jsch-classes. Das Testen mit FileZilla hilft hier nicht sehr.

Der wahrscheinlichste Grund, den ich hier sehen kann, ist, dass die Auflösung des Namens an einem bestimmten Punkt fehlgeschlagen ist (Nichtverfügbarkeit des internen DNS-Servers, etc.). Java hat einen eigenen DNS-Cache, der unabhängig vom Betriebssystem funktioniert. Selbst wenn Sie einen Namen in der Befehlszeile finden, wird er in Java als nicht lösbar angesehen. Sie können die TTL-Einstellungen dieses internen Cache mit den Systemeigenschaften networkaddress.cache.ttl und networkaddress.cache.negative.ttl ändern. Das Setzen einer oder beider Eigenschaften auf 0 führt zur Deaktivierung dieses bestimmten Caches.

Sie könnten versuchen, wenn die Situation besser wird, wenn Sie letztere deaktivieren, aber Sie sollten versuchen, herauszufinden, was die Ursache des Problems ist, dh warum Sie den Namen nicht irgendwann während des Tages auflösen können, weil er deaktiviert wird Der Cache kommt mit einem Preis (nämlich Leistungsverlust).

0

Alle Themen wirft UnknownHostException bei dem Versuch, neue Sitzung und Exception bis zu 5 bis 10 Minuten andauert, zu erstellen, nachdem einige Zeit Programm normal funktioniert, ich kann nicht der Lage zu finden, was für diese Ausnahme verursachen ...

Das ist ziemlich selbsterklärend. Lesen der javadocs for UnknownHostException:

ausgelöst, um anzuzeigen, dass die IP-Adresse eines Hosts nicht ermittelt werden konnte.

auf den Code der Suche nach AbstractPlainSocketImpl ich sehe:

if (addr.isUnresolved()) 
    throw new UnknownHostException(addr.getHostName()); 

So Ihre sftp.opsbank2-prod.tio.systems Hostnamen nicht behebt. Das bedeutet, dass der Namensauflösungscode von Java nicht bestimmen kann, wie die IP für diesen Hostnamen lautet.

Hier sind einige Dinge zu versuchen:

  • Verwenden Sie die IP des Host-Namen anstelle des Namens.
  • Verwenden Sie oder host Befehle, um diesen Hostnamen auf diesem System nachzusehen, um zu sehen, ob er verrechnet wird.
  • Probieren Sie die folgende Codezeile aus, um zu sehen, ob es funktioniert. Es sollte werfen:

    new java.net.Socket("unknown.host.should.throw.com", 80).close(); 
    
  • Ihren Hostnamen Versuchen Sie jetzt:

    new java.net.Socket("sftp.opsbank2-prod.tio.systems", 80).close(); 
    

Wenn Sie sehen, dass Ihr Hostname dann nicht aufgelöst wird, werden Sie es auf die DNS-Konfigurationen hinzufügen müssen oder /etc/hosts Datei. Wenn Sie bereits haben, dann stimmt etwas nicht mit diesen Dateien und Sie müssen Ihre Konfiguration erneut überprüfen.