使用 Java 连接 SFTP 时发生 UnknownHostException

rad*_*nan 5 java linux sftp jsch amazon-ec2

我正在尝试使用 java 中的 5 个线程将文件连续上传到 SFTP 服务器,在启动程序时正确上传文件但过了一段时间,

所有线程在尝试创建新会话时都会抛出 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();
Run Code Online (Sandbox Code Playgroud)

例外 :

 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)
Run Code Online (Sandbox Code Playgroud)

谁能解释一下,这个错误的根本原因是什么

Lot*_*har 1

正如您在堆栈跟踪中看到的那样,问题不是 JSCH 特定的问题,因为它发生在 java.net 包的类中,而不是在 jsch 类中。因此,使用 FileZilla 进行测试在这里没有多大帮助。

我在这里看到的最可能的原因是名称解析在某些时候确实失败(内部 DNS 服务器不可用等)。Java 有自己的 DNS 缓存,它独立于操作系统工作,因此即使您可以在命令行上解析名称,它在 Java 中仍然会被视为无法解析。networkaddress.cache.ttl您可以使用系统属性和来更改该内部缓存的 TTL 设置networkaddress.cache.negative.ttl。将这些属性中的一个或两个设置为 会0导致该特定缓存停用。

您可以尝试如果停用后者,情况是否会好转,但您应该尝试找出问题的根源是什么,即为什么您无法在一天中的某个时间解析名称,因为停用缓存会伴随而来价格(即性能损失)。