記一次java代碼連接sftp出錯

異常信息:

com.jcraft.jsch.JSchException: channel is not opened.
    at com.jcraft.jsch.Channel.sendChannelOpen(Channel.java:765)
    at com.jcraft.jsch.Channel.connect(Channel.java:151)
    at com.jcraft.jsch.Channel.connect(Channel.java:145)
    at com.lqting.common.utils.SFTPUtil.connect(SFTPUtil.java:71)
    at com.lqting.common.batchjob.FileReadTask.handTask(FileReadTask.java:83)
    at com.lqting.framework.batchjob.AbstractBatchJobHandler.runBatchJob(AbstractBatchJobHandler.java:54)
    at com.lqting.framework.batchjob.AbstractBatchJobHandler.execute(AbstractBatchJobHandler.java:37)
    at org.quartz.core.JobRunShell.run(JobRunShell.java:202)
    at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573)

可能的原因:(查找資料的結果,供挑選)

  1. 服務器內存不足
  2. 連接數太小
  3. 安裝了其他應用衝突(這個是我猜的)
  4. 連接的超時時間過短

本次記錄針對2、4

2,連接數太小

命令查詢當前連接數:w | grep pts |wc -l

(這是同事給我的,不過這是查詢通過ssh連接服務器的數量)

修改/etc/ssh/sshd_config 將MaxStartups 加大,增大到合適的值

4,連接的超時時間過短

這是代碼層面可控的了。

本次記錄也主要是由於這個原因導致的,由於網絡速度並不是很快,通過ftp工具連接sftp服務都老長時間了,所以代碼連接時拋異常了。修改爲

解決方案:

由原代碼:

Channel channel = sshSession.openChannel("sftp");
channel.connect();
修改爲
Channel channel = sshSession.openChannel("sftp");
channel.connect(60000);

增加一個超時時間設置。

超時時間大於0的話,底層會有等待的時間和次數。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章