在一个批量下载文件的程序时,发现下载的文件出错,最多只能下载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();//添加关闭