JSch - inputstream is closed

filth

Bekanntes Mitglied
Hallo,

ich verwende die JSch Bibliothek um Dateien zu einem Server zu übertragen.
Einer der User hatte am Wochenende wohl ein Problem. Die Exception in der Log sagt folgendes:

Code:
Date: Sun Mar 13 09:23:20 CET 2011
You crashed thread Thread-209
Exception was: 4: java.io.IOException: inputstream is closed
Trace: --> at com.jcraft.jsch.ChannelSftp._put(ChannelSftp.java:577)--> 
at com.jcraft.jsch.ChannelSftp.put(ChannelSftp.java:388)--> 
at nClient.Ftp.SSHUploadClient.upload(SSHUploadClient.java:149)--> 
at nClient.Packupload.PictureUpload.uploadPremiums(PictureUpload.java:204)--> 
at nClient.Packupload.PictureUpload.doUpload(PictureUpload.java:163)--> 
at nClient.Packupload.PackUploader.uploadPics(PackUploader.java:189)--> 
at nClient.Controller$2.run(Controller.java:596)
Additional Info:  OS: Windows 7 |

Die SSHUploadClient-Klasse sieht folgendermaßen aus:

Java:
	public void upload( String remoteFile, String localFile) 
	{
		checkConnection();
		
		SftpProgressMonitor monitor = new SSHProgressMonitor(myController);
		int mode=ChannelSftp.OVERWRITE;
				
		try {
			channel.put(remoteFile, localFile, monitor, mode);
		} catch (SftpException e) {
			CustomExceptionHandler myEx = new CustomExceptionHandler();
			myEx.logError(e);
		}
	}

Ich kann nicht wirklich was mit dem Fehler anfangen - jemand eine Idee? Wurde während der Übetragung die Verbindung serverseitig geschlossen?

Danke
 
Ja der Stream zum Server wurde geschlossen. Von wem steht da nicht. Firewall Router Sync Server usw könnte überall geschlossen wurden seien.
 
Wie kann man sowas abfangen? In der checkConnection() prüfe ich ob der Stream bzw die Connection noch da ist, aber scheinbar reicht es in Einzelfällen nicht aus
 
Sollte das in etwa so aussehen?


Java:
    public void upload( String remoteFile, String localFile) 
    {
        checkConnection();
        
        SftpProgressMonitor monitor = new SSHProgressMonitor(myController);
        int mode=ChannelSftp.OVERWRITE;
                
        try {
            channel.put(remoteFile, localFile, monitor, mode);
        } catch (Exception e) {
            		if(e.equals(new java.io.IOException()))
			{
				// CODE
			}
        }


    }
 
Die Fallunterscheidung bei den Exceptions a) ist Quatsch und b) wird nicht funktionieren.

Besser:
Java:
try {
 /* ... */
} catch (IOException iox) { //--- nur IOExceptions fangen, dann spart man sich auch die Fallunterscheidung
}

Oder - wenn man denn wirklich auch andere Exceptions fangen muss - z.B. so
Java:
try {
 /* ... */
} catch (IOException iox) { 
  /* spezifische Behandlung der IOException */
} catch (NumberFormatException nfx) { 
  /* spezifische Behandlung der NumberFormatException */
}
 
Ist serverseitig was zu erkennen das er den Upload beginnt und dann abbricht? Ansonsten beim abfangen der Exception gleich nen neuen Uploadversuch.
 
Die Fallunterscheidung bei den Exceptions a) ist Quatsch und b) wird nicht funktionieren.

Besser:
Java:
try {
 /* ... */
} catch (IOException iox) { //--- nur IOExceptions fangen, dann spart man sich auch die Fallunterscheidung
}

Oder - wenn man denn wirklich auch andere Exceptions fangen muss - z.B. so
Java:
try {
 /* ... */
} catch (IOException iox) { 
  /* spezifische Behandlung der IOException */
} catch (NumberFormatException nfx) { 
  /* spezifische Behandlung der NumberFormatException */
}


Das klappt aber so nicht - bei dem IOException-Block meckert er, dass diese Exception nicht geworfen wird.

@areafo: In den ssh-Logs ist nichts verdächtiges zu sehen.
 
Schwer zu sagen. Weitere Code Teile? Hast du schonmal was uppen können? Cached du das dann im Dateisystem aufm Server? Größe der Datei? Serverumgebung noch was besonderes?
 
Schwer zu sagen. Weitere Code Teile? Hast du schonmal was uppen können? Cached du das dann im Dateisystem aufm Server? Größe der Datei? Serverumgebung noch was besonderes?

Welche Codeteile sind noch relevant? Die poste ich dann gerne.

Also der Upload funktioniert in der Regel problemlos. Am Wochenende wurden etwa 16.000 Dateien auf diese Art und Weise übertragen, diese Meldung ist bis jetzt die einzige, die ich bekommen habe. Bei der gleichen Person war es (wie zu erwarten) nicht reproduzierbar.

Die Dateigröße liegt bei etwa 1-2 MB.

Der Server ist ein Debian6 System:
Code:
model name      : Intel(R) Core(TM)2 Quad CPU    Q6700  @ 2.66GHz
stepping        : 11
cpu MHz         : 2666.491
cache size      : 4096 KB

Code:
Linux backend1 2.6.32-5-amd64 #1 SMP Wed Jan 12 03:40:32 UTC 2011 x86_64 GNU/Linux
 
Achso wenn es nicht reproduzierbar ist naja. Am besten clientseitig und oder serverseitig noch eine Logmethode implementieren die hin u wieder Error logs irgendwo gesammelt auf dem Server ablegen kann, damit du das Monitoren kannst. Das der Thread gecrashed ist und die Connection beendet wurde kann an allem möglichen liegen.
 

Zurück
Oben