要求读取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; }
上面代码有个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);
这样就初始化了两个,最后关闭一个时间一长就出问题了