在上篇《记一次fastdfs高并发下上传失败的问题》文章中,我改造了我的程序,本以为是成功解决了dfs在高并发情况下的io问题,但是这个问题解决的不彻底,有时候还会出现。所以我决定引入连接池。
我用的是tobato大神写连接池,在这里简单介绍一下,具体大家可以直接去看源码
地址:GitHub - tobato/FastDFS_Client: Java Client for FastDFS
FastDFS论坛:FastDFS FAQ (欢迎反馈,我将及时整理) - 分布式文件系统(FastDFS)-Chinaunix
主要特性
- 对关键部分代码加入单元测试,理解与服务端的接口交流,提高接口质量
- 将以前对字节解析样式为使用对象+注解解的形式,努力增强了代码的硬性
- 支持对服务端的连接池管理(commons-pool2)
- 支持上传图片时检查图片格式,并且自动生成
- 在SpringBoot中自动导入依赖
使用接口服务对dfs服务端进行操作
主要接口包括
- TrackerClient - TrackerServer 接口
- GenerateStorageClient - 一般文件存储(StorageServer接口接口)
- FastFileStorageClient - 为方便项目开发集成的简单接口(StorageServer接口)
- AppendFileStorageClient - 支持文件续传操作的接口(StorageServer接口)
Maven 依赖
<dependency>
<groupId>com.github.tobato</groupId>
<artifactId>fastdfs-client</artifactId>
<version>1.27.2</version>
</dependency>
application.yml配置
配置参数可以根据配置情况自行调整
# 分布式文件系统FDFS配置
fdfs:
#读取时间
so-timeout: 20000
#连接超时时间
connect-timeout: 20000
thumb-image: #缩略图生成参数
width: 150
height: 150
tracker-list: #TrackerList参数,支持多个
- 127.0.0.1:22122
pool:
#从池中借出的对象的最大数目(配置为-1表示不限制)
max-total: 30
#每个key最大连接数
max-total-per-key: 25
#每个key对应的连接池最大空闲连接数
max-idle-per-key: 10
#每个key对应的连接池最小空闲连接数
min-idle-per-key: 5
使用方式
直接注入对象调用api即可
注入FastFileStorageClient对象,直接调用api即可
/**
* 上传一般文件
*
* @param inputStream
* @param fileSize
* @param fileExtName
* @param metaDataSet
* @return
*/
StorePath uploadFile(InputStream inputStream, long fileSize, String fileExtName, Set<MetaData> metaDataSet);
/**
* 上传图片并且生成缩略图
* <pre>
* 支持的图片格式包括"JPG", "JPEG", "PNG", "GIF", "BMP", "WBMP"
*
* 缩略图为上传文件名+缩略图后缀 _150x150,如 xxx.jpg,缩略图为 xxx_150x150.jpg
*
* 实际样例如下
*
* 原图 http://localhost:8098/M00/00/17/rBEAAl33pQaAWNQNAAHYvQQn-YE374.jpg
* 缩略图 http://localhost:8098/M00/00/17/rBEAAl33pQaAWNQNAAHYvQQn-YE374_150x150.jpg
*
* </pre>
*
* @param inputStream
* @param fileSize
* @param fileExtName
* @param metaDataSet
* @return
*/
StorePath uploadImageAndCrtThumbImage(InputStream inputStream, long fileSize, String fileExtName,
Set<MetaData> metaDataSet);
/**
* 上传图片
* <pre>
* 可通过fastImageFile对象配置
* 1. 上传图像分组
* 2. 上传元数据metaDataSet
* 3. 是否生成缩略图
* 3.1 根据默认配置生成缩略图
* 3.2 根据指定尺寸生成缩略图
* 3.3 根据指定比例生成缩略图
* <pre/>
*
* @param fastImageFile 上传文件配置
* @return
*/
StorePath uploadImage(FastImageFile fastImageFile);
/**
* 上传文件
* <pre>
* 可通过fastFile对象配置
* 1. 上传图像分组
* 2. 上传元数据metaDataSet
* <pre/>
* @param fastFile
* @return
*/
StorePath uploadFile(FastFile fastFile);
/**
* 删除文件
*
* @param filePath 文件路径(groupName/path)
*/
void deleteFile(String filePath);