首页 > 其他 > 详细

commons-pool实现FTP连接池

时间:2020-06-28 21:48:45      阅读:126      评论:0      收藏:0      [点我收藏+]

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 }
KeyedPoolableObjectFactory实现

 

commons-pool实现FTP连接池

原文:https://www.cnblogs.com/zmngc/p/13204971.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!