com.jcraft.jsch.JSchException: channel is not opened解決方案
阿新 • • 發佈:2019-01-08
在一個批量下載檔案的程式時,發現下載的檔案出錯,最多隻能下載10個檔案,剩下的檔案丟失了,檢視程式碼,也沒有邏輯上的錯誤,下載丟失也沒報錯
考慮到之前出現過前臺頁面傳入後臺的值丟失,然後在後臺對前臺輸入的資訊進行println,發現數據未丟失,也未傳2次而多出null,
Session session = connection.getSession(user, ip, port);
ChannelExec channelExec = (ChannelExec) session.openChannel("exec");
channelExec.setCommand(cmd);
channelExec.setInputStream (null);
channelExec.setErrStream(System.err);
channelExec.connect();
然後使用try,catch進行捕捉,檢視日誌發現在下載第十一個檔案的時候總是失敗
錯誤資訊com.jcraft.jsch.JSchException: channel is not opened.,
可能原因預設的session時間有限制,然後對session時間進行獲取
println("session timeout" + session.getTimeout())
獲取到的session時間是0,發現沒什麼問題,然後設定了一個長一點的時間試試
session.setTimeout(600000);
問題並沒有解決
也可能是環境有問題,檢視一下配置檔案,可能是session有限制
檢視sshd_config
在配置檔案中有MaxSessions,原來是10,我把它改成了20,並去掉了“#”符號,儲存後重啟
然後重新執行工程,發現這次下載的是20個檔案,沒有丟失,又多試了幾次,效果很理想,問題算是解決了吧,原來這裡MaxSession預設是的10,所以只能最多連線10次。
//———————————————————————-
上述方法可以解決這個問題,但不是最好的,在原來的程式碼裡存在bug,在這個方法裡呼叫的另一個方法,只有開啟,沒有關閉,所以導致上述問題
Channel channel = session.openChannel("sftp")
channel.disconnect();//新增關閉