• 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);

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



  • 相关阅读:
    WPF 中英文切换
    System.Data.Entity.Core.ProviderIncompatibleException:0x89c50107
    WinForm使用原生gdi+绘制自定义曲线图、折线图
    C#使用EPPlus读写excel
    ICSharpCode.SharpZipLib C# 压缩文件夹SharpZipHelper
    C# XSLT 转换word 生成word
    代码生成器集合
    优秀的个人博客
    面试经典复习资料
    图解算法
  • 原文地址:https://www.cnblogs.com/lyon91/p/11196606.html
Copyright © 2020-2023  润新知