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)
谁能解释一下,这个错误的根本原因是什么
正如您在堆栈跟踪中看到的那样,问题不是 JSCH 特定的问题,因为它发生在 java.net 包的类中,而不是在 jsch 类中。因此,使用 FileZilla 进行测试在这里没有多大帮助。
我在这里看到的最可能的原因是名称解析在某些时候确实失败(内部 DNS 服务器不可用等)。Java 有自己的 DNS 缓存,它独立于操作系统工作,因此即使您可以在命令行上解析名称,它在 Java 中仍然会被视为无法解析。networkaddress.cache.ttl
您可以使用系统属性和来更改该内部缓存的 TTL 设置networkaddress.cache.negative.ttl
。将这些属性中的一个或两个设置为 会0
导致该特定缓存停用。
您可以尝试如果停用后者,情况是否会好转,但您应该尝试找出问题的根源是什么,即为什么您无法在一天中的某个时间解析名称,因为停用缓存会伴随而来价格(即性能损失)。