2017-09-02 103 views
2

連接SFTP當我試圖不斷地上傳文件到使用Java 5個的線程, 在正常啓動的程序上傳文件,但一段時間後,SFTP服務器,的UnknownHostException occures使用Java

的所有線程拋出的UnknownHostException試圖創建時新的會話和異常持續高達5〜10分鐘,一段時間程序正常工作後,我不能找到什麼會導致這種異常,

這是用於連接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(); 

例外:

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) 

誰能請解釋一下我,什麼是根本原因這個錯誤

+0

目標主機出現故障的可能性有多大? – Xvolks

+0

我想一些打開的套接字沒有正確關閉。我建議你先查看/更改程序。如果錯誤仍然發生,也許你可以嘗試解決方案https://stackoverflow.com/q/30207301 –

+0

@Xvolks否,當我發現這個異常時,我仍然可以通過FileZilla訪問主機。 – radhakrishnan

回答

2

的問題是不是可以用堆棧跟蹤看到,因爲它在一個類中發生的特定JSCH一的java.net包,而不是在jsch-classes中。因此,使用FileZilla進行測試對此無關緊要。

我在這裏可以看到的最可能的原因是名稱的解析確實在某些時候失敗了(內部DNS服務器不可用等)。 Java有自己的獨立於操作系統的DNS緩存,所以即使你可以在命令行上得到解析的名字,它仍然會在Java中被視爲無法解析。您可以使用系統屬性networkaddress.cache.ttlnetworkaddress.cache.negative.ttl更改該內部緩存的TTL設置。將這些屬性中的一個或兩個設置爲0將導致該特定緩存的停用。

如果您停用後者,您可能會嘗試如果情況變得更好,但您應該嘗試找出問題的根源,即爲什麼在一天中的某個時間無法解析名稱,因爲停用緩存帶有價格(即性能損失)。

0

所有線程試圖創建新的會話和異常時拋出UnknownHostException持續到5〜10分鐘,一段時間程序正常工作後,我不能找到什麼會導致此異常...

這是很自我解釋。讀取javadocs for UnknownHostException

拋出以指示無法確定主機的IP地址。

看代碼爲AbstractPlainSocketImpl我看到:

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

所以你sftp.opsbank2-prod.tio.systems主機名不解決。這意味着Java的名稱解析代碼無法確定該主機名的IP是什麼。

這裏有一些事情要嘗試:

  • 使用主機名而不是名稱的IP。
  • 使用或host命令在該系統上查找該主機名以查看是否解析。
  • 請嘗試下面的代碼行以查看它是否有效。它也應該拋出:

    new java.net.Socket("unknown.host.should.throw.com", 80).close(); 
    
  • 現在就來試試您的主機名:

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

如果你看到你的主機名不解決,那麼你就需要將其添加到DNS的配置或/etc/hosts文件。如果你已經有了,那麼這些文件有問題,你需要重新檢查你的配置。