1. 待解决问题
最近在优化一个使用FTP向各种外部系统分发文件的功能,目前方案是本地系统先生成文件然后在定时器中统一分发文件。
问题1:FTP有多个,循环文件判断需要使用的FTP,然后创建FTP连接,发送文件。这样是每个文件都会创建一次FTP连接,文件多时很容易造成定时器超时
解决方法:使用连接池减少FTP连接次数
2. 调研commons-pool
3. 实现方案
1 @Component 2 public class FtpKeyedPoolableObjectFactory extends BaseKeyedPooledObjectFactory<String, FTPClient> { 3 4 @Override 5 public FTPClient create(String key) { 6 System.out.println(channel + "FTP连接开始创建===="); 7 FTPClient ftpClient; 8 switch (key) { 9 case "key1": 10 ftpClient = this.createFTPClient("",21,"",""); 11 break; 12 case "key2": 13 ftpClient = this.createFTPClient("",21,"",""); 14 break; 15 case "key3": 16 ftpClient = this.createFTPClient("",21,"",""); 17 break; 18 default: 19 ftpClient = new FTPClient(); 20 } 21 System.out.println(channel + "FTP连接创建完成===="); 22 return ftpClient; 23 } 24 25 @Override 26 public PooledObject<FTPClient> wrap(FTPClient ftpClient) { 27 return new DefaultPooledObject<>(ftpClient); 28 } 29 30 /** 31 * 销毁FtpClient对象 32 */ 33 @Override 34 public void destroyObject(String channel, PooledObject<FTPClient> ftpPooled) { 35 if (ftpPooled == null) { 36 return; 37 } 38 39 FTPClient ftpClient = ftpPooled.getObject(); 40 41 try { 42 if (ftpClient.isConnected()) { 43 ftpClient.logout(); 44 } 45 } catch (IOException ioe) { 46 Loggers.BIZ.error("关闭FTP登出异常", ioe); 47 } finally { 48 try { 49 ftpClient.disconnect(); 50 } catch (IOException ioe) { 51 Loggers.BIZ.error("关闭FTP连接失败", ioe); 52 } 53 } 54 } 55 56 /** 57 * 验证FtpClient对象 58 */ 59 @Override 60 public boolean validateObject(String channel, PooledObject<FTPClient> ftpPooled) { 61 try { 62 FTPClient ftpClient = ftpPooled.getObject(); 63 return ftpClient.sendNoOp(); 64 } catch (IOException ioe) { 65 Loggers.BIZ.error("查看FTP连接状态失败", ioe); 66 } 67 return false; 68 } 69 70 public FTPClient createFTPClient(String address, int port, String username, String password) { 71 FTPClient ftpClient = new FTPClient(); 72 try { 73 ftpClient.connect(address, port); 74 ftpClient.login(username, password); 75 ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE); 76 int reply = ftpClient.getReplyCode(); 77 if (!FTPReply.isPositiveCompletion(reply)) { 78 ftpClient.logout(); 79 Loggers.BIZ.warn("FTP服务器连接失败",null); 80 } 81 } catch (Exception e) { 82 Loggers.BIZ.error("FTP登录失败", e); 83 } 84 return ftpClient; 85 } 86 }
原文:https://www.cnblogs.com/zmngc/p/13204971.html