sftp实战

要求读取sftp 目录下的文件解析入库

SFTP配置类

// 远程服务器ip
    public static String HOST = "192.168.204.7";

    // 远程服务器端口
    public static int PORT = 22;

    // 远程服务器用户名
    public static String USERNAME = "teys02";

    // 远程服务器密码
    public static String PASSWORD = "9sL";

    // 文件临时存放路径
    public static String SAVEPATH = "/opt/saas/isc-dtt/sap/";

存放路径注意权限

注意点:

Vector a = sftp.ls("/path");

定位到文件的目录

ChannelSftp.LsEntry entry = (ChannelSftp.LsEntry) ite.next();
 String filename = entry.getFilename();
 log.info("filename"+filename);

获取文件的名字例如:FTPCN_PT001S (1).xml

这里读取的时候会连文件夹名称一起读取

所以加了校验

 if(filename.contains("FTPCN")){

下载的文件

String path = FTPConfig.SAVEPATH + filename;
 log.info("本地保存 path = " + path);
// 下载文件 1下载的路径 2是保存的路径
 SftpUtil.download("/path/" + filename, path, sftp);

是下载的相对路径/path/xx.xml

如果路径错误下载的就是空文件

下载完成后,对保存的路径做便利 读取
File file2 = new File(FTPConfig.SAVEPATH);
   if(file2.exists()){
       File[] files = file2.listFiles();
       if (files.length == 0) {
            log.info("文件夹是空的!");
       } else {
      for (File file : files) {
        log.info("#########读取文件  " + file.getAbsolutePath());

查看是否下载到服务器的文件夹内

完整代码(有bug)
public void dealData() {
        ChannelSftp sftp = null;

        int number = 0;
        try {
            sftp = SftpUtil.getSftpConnect(FTPConfig.HOST, FTPConfig.PORT, FTPConfig.USERNAME,
                FTPConfig.PASSWORD);
            if (null == sftp) {
                int timesOfResend = 5;
                int _connectCount = 1;
                //SFTP连接失败,尝试重连5次
                while (timesOfResend > 0 && sftp == null) {
                    //间隔60秒
                    Thread.sleep(60000);
                    sftp = SftpUtil.getSftpConnect(FTPConfig.HOST, FTPConfig.PORT, FTPConfig.USERNAME,
                        FTPConfig.PASSWORD);
                    if(sftp == null){
                        log.info(taskName, "尝试重连 --> " + (_connectCount++) +"次失败,sftp = "+ sftp);
                    }else{
                        log.info(taskName, "尝试重连 --> " + (_connectCount++) +"次成功,sftp = "+ sftp);
                    }

                    timesOfResend--;
                }
            }

            if (null == sftp) {
                log.info("InitSftpConnection", "SFTP尝试重连5次后失败,SFTP==null");
                //通知LinkWin
                //return ResultVO.connectionError("SFTP尝试重连5次后失败");
            } else {
                // 获取文件路径和文件名称
               /* String pwd = sftp.pwd();
                log.info("pwd"+pwd);
*/
                /*Vector b = sftp.ls("/");
                for(Iterator ite=b.iterator(); ite.hasNext();) {
                    log.info("b==="+ite.next().toString());
                }*/


                Vector a = sftp.ls("/path");
                for(Iterator ite=a.iterator(); ite.hasNext();) {
                    ChannelSftp.LsEntry entry = (ChannelSftp.LsEntry) ite.next();
                    String filename = entry.getFilename();
                   //s SftpATTRS attrs = entry.getAttrs();

                    //log.info("attrs"+attrs);
                    log.info("filename"+filename);
                    if(filename.contains("FTPCN")){
                        String path = FTPConfig.SAVEPATH + filename;

                        // 上传到azure
                        //InitaZureConnection.upload(path);
                        log.info("本地保存 path = " + path);
                        // 下载文件 1下载的路径 2是保存的路径
                        SftpUtil.download("/path/" + filename, path, sftp);

                        File file2 = new File(FTPConfig.SAVEPATH);
                        if(file2.exists()){
                            File[] files = file2.listFiles();
                            if (files.length == 0) {
                                log.info("文件夹是空的!");
                            } else {
                                for (File file : files) {
                                    log.info("#########读取文件  " + file.getAbsolutePath());
                                    Document document = XmlUtils.getDocument(file);
                                    Element rootElement = document.getRootElement();
                                    Element rec = rootElement.element("RECORDSET");
                                    if(file.getAbsolutePath().contains(SapConstants.FTPCN_PT001S)){
                                        log.info("-----createHu");
                                        createHu(rec);
                                    }else if(file.getAbsolutePath().contains(SapConstants.FTPCN_PT002S)){
                                        log.info("-----createObd");
                                        createObd(rec);
                                    }else if(file.getAbsolutePath().contains(SapConstants.FTPCN_PT003S)){
                                        log.info("-----createIbd");
                                        createIbd(rec);
                                    }
                                }
                            }
                    }



                    }
                }
               
                SftpUtil.exit(sftp);


                // 通知linkwin
                //log.info("InitSftpConnection", "number="+ number);
            }
        }  catch (Exception e) {
            log.info("InitSftpConnection", e);
        } finally {
            if (null != sftp) {
                SftpUtil.exit(sftp);
            }
        }
        //return null;
    }
View Code
上面代码有个BUG,重复读取了文件夹下的文件。
因为先是iteratrot 然后又file。files()
更新版
for(Iterator ite=a.iterator(); ite.hasNext();) {
                    ChannelSftp.LsEntry entry = (ChannelSftp.LsEntry) ite.next();
                    String filename = entry.getFilename();
                   //s SftpATTRS attrs = entry.getAttrs();

                    //log.info("attrs"+attrs);
                    log.info("filename"+filename);
                    if(filename.contains("FTPCN")){
                        String path = FTPConfig.SAVEPATH + filename;

                        // 上传到azure
                        //InitaZureConnection.upload(path);
                        log.info("本地保存 path = " + path);
                        // 下载文件 1下载的路径 2是保存的路径
                        SftpUtil.download(FTP_FILEPATH+"/" + filename, path, sftp);

                        File file = new File(path);
                        log.info("#########读取文件  " + file.getAbsolutePath());
                        Document document = XmlUtils.getDocument(file);
                        Element rootElement = document.getRootElement();
                        Element rec = rootElement.element("RECORDSET");
                        if(file.getAbsolutePath().contains(SapConstants.FTPCN_PT001S)){
                            log.info("-----createHu");
                            createHu(rec);
                        }else if(file.getAbsolutePath().contains(SapConstants.FTPCN_PT002S)){
                            log.info("-----createObd");
                            createObd(rec);
                        }else if(file.getAbsolutePath().contains(SapConstants.FTPCN_PT003S)){
                            log.info("-----createIbd");
                            createIbd(rec);
                        }
                    }
                }
SFTP 连接查询
netstat -nat | grep -i "22" | wc -l

其实是查看这个22端口的连接数

sftp.getSession().disconnect();
            sftp.quit();

sftp关闭一定要关闭session,否则是没有真正关闭的,会导致会话数过多

初始化连接的时候一定要注意,不要初始化过多
 sftp = SftpUtil.getSftpConnect(host, Integer.valueOf(port), username, password);
           
 sftp = SftpUtil.getSftpConnect(host, Integer.valueOf(port), username, password);

这样就初始化了两个,最后关闭一个时间一长就出问题了



原文地址:https://www.cnblogs.com/lyon91/p/11196606.html