专栏首页与神兽党一起成长使用FTP连接池封装工具类

使用FTP连接池封装工具类

使用FTP连接池封装工具类

背景

早前的思路是将FTP连接的管理(对象池功能)与FTP工具类(上传下载方法)在一个工程中实现,在工具类中调用是模板类提供的模板方法, 由模板方法与对象池打交道——初始时获取对象,结束时归还对象。将对象池引用在模板类中暴露出来,模板类的模板方法需要很多的样板式代码, 虽然这是不可避免的,但是模板方法即API的设计限制了扩展的可能。 为了不暴露对象池引用,在ftpcp项目中已经将对象池功能封装到内部,自然地使用获取资源和关闭资源方式,这在新的模板方法中可以节省不少笔墨。 另外参考Spring的JdbcTemplate的实现,或许可以提供一种新的思路去设计模板类。

改造

在设计工具类之前先设计模板类,这回模板类的模板方法不执行具体的操作逻辑了,把这些逻辑交给回调类。而工具类是建立在模板类基础上的,更多地是提供回调接口的具体实现来完成整体的操作。

设计模板类

首先定义通用的操作接口方法,使用的是泛型方法,

public interface FTPOperations {
    
    <T> T execute(FTPClientCallback<T> action) throws FTPAccessException;
    
    <T> T execute(FTPConnectionCallback<T> action) throws FTPAccessException;
    
    <T> List<T> execute(ListFTPConnectionCallback<T> action) throws FTPAccessException;
}

然后是继承实现模板类,

public class FTPClientTemplate implements FTPOperations, InitializingBean{
  private FTPManager ftpManager;
    public <T> T execute(FTPConnectionCallback<T> action) throws FTPAccessException {
        Assert.notNull(action, "Callback object must not be null");

        FTPConnection conn = null;
        try {
            conn = FTPConnectionUtil.getConnection(ftpManager);
            return action.doInFTPConnection(conn);
        }
        catch (FTPException ex) {
            throw new FTPAccessException(ex);
        }
        finally {
            FTPConnectionUtil.releaseConnection(conn);
        }
    }
}

模板类中引入FTPManager,可以从中获取连接对象。模板方法主要的逻辑是获取连接对象,然后将连接对象交给回调对象,由回调对象执行具体的逻辑,最后将连接对象释放。 这里完全看不到连接池的影子。

public interface FTPConnectionCallback<T> {

    T doInFTPConnection(FTPConnection conn) throws FTPException, FTPAccessException;
}

模板方法是泛型方法,而回调接口的泛型是定义在接口上的,在这里可以这样理解,由回调接口的类型推导模板方法的返回类型,具体的返回类型还是由具体的执行逻辑来决定。 回调并不是异步,回调是具体操作逻辑的封装。

设计工具类

在工具类中引入模板类,构造回调实例,调用模板方法即可,比如上传文件方法中,

public class CommonFAOSupport implements InitializingBean {
    public boolean uploadFile(final String directory, final String fileName, final String content) {
        FTPConnectionCallback<Boolean> action = new FTPConnectionCallback<Boolean>() {

            public Boolean doInFTPConnection(FTPConnection conn) throws FTPException, FTPAccessException {
                FTPClient client = conn.unwrap(FTPClient.class);
                boolean flag = false;
                BufferedInputStream bis = null;
                try {
                    flag = client.changeWorkingDirectory(directory);
                    if(flag) {
                        bis = new BufferedInputStream(new ByteArrayInputStream(content.getBytes(StandardCharsets.UTF_8.name())));
                        flag = client.storeFile(fileName, bis);
                    }
                    return flag;
                } catch (IOException e) {
                    throw new FTPAccessException(e);
                }
            }
            
        };
        return ftpClientTemplate.execute(action);
    }
}

在工具类的方法内写好执行逻辑封装成回调实例,传递给模板方法ftpClientTemplate.execute(action),获取连接对象和释放都由模板方法来完成, 回调实例中假定一定能获得连接对象,直接使用。 工具类中还有多线程下载的例子,略微有点负责,一次使用多个连接对象,不过获取多个连接对象也是由模板方法来完成的,职责上还是清晰的。 总体上看,回调对象获得连接对象后就可以做任何事情了,而模板方法再也没有具体的执行逻辑了。

项目地址

https://github.com/Honwhy/com... 见ftpcp分支

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 在MySQL中处理组织层次(中文路径)

    假设有这样的组织层次,“某某局”,“某某局>某某部”,“某某局>某某部>某某下属组织”, “某某局”是一级组织所以他的组织层次就是他自己的组织名字,而类似“某...

    用户3579639
  • Webservice On Netty

    Java的世界属于开源的世界,所谓开源的世界,只要你能想到的点子就一定有人实现了,没有你就自己造一个啊。

    用户3579639
  • ConcurrentLinkedQueue vs BlockingQueue比较

    结果 /// /// /// ///=============/// blocking version cost ms:22052 lock free cost...

    用户3579639
  • 前端页面热更新实现方案

    腾讯NEXT学位
  • 微信服务号模板消息接口新增"设置行业"和"添加模板"及细节优化

      微信服务号模板消息可以向用户发送重要的服务通知,如信用卡刷卡通知,商品购买成功通知等。昨日,微信团队发布公告称模板消息新增“设置行业”和“添加模板”接口及细...

    ytkah
  • 设计模式—— 十 :模板方法模式

    模板方法模式是结构最简单的行为型设计模式,在其结构中只存在父类与子类之间的继承关 系。通过使用模板方法模式,可以将一些复杂流程的实现步骤封装在一系列基本方法中,...

    三分恶
  • 《C++Primer》第十六章 模板与泛型编程

    模板定义以关键字template关键字开始,后面跟着一个模板参数列表(不能为空):

    TOMOCAT
  • 互联网公司网站模板分享「网站模板」

    今天给大家分享的是一套互联网公司网站模板,此模板比较简单,但是完全可以经过简单的调整应用于网站上面。

    小白程序猿
  • [Oracle ASM全解析] 管理磁盘组模板

    7-5 为冗余属性的值和磁盘组冗余级别的对应关系,有MIRROR,HIGH,UNPROTECTED三种

    bsbforever
  • 教你使用“百度统计”黑科技,根据不同维度分析网站的访问质量

    跳出率指的是只访问了入口页面(例如网站首页)就离开的访问量与所产生总访问量的百分比。跳出率计算公式:跳出率=访问一个页面后离开网站的次数/总访问次数。

    架构师小跟班

扫码关注云+社区

领取腾讯云代金券