问题描述
根据官方文档 安装完FastDFS服务器后, 服务正常启动,但是在 SpringBoot 项目使用 fastdfs-client 客户端报错无法获取服务端连接资源:can't create connection to/xx.xx.xx.xx:0
, 一系列排查发现是获取到的 tracker 端口为 0 。
com.luhuiguo.fastdfs.exception.FdfsConnectException: 无法获取服务端连接资源:can't create connection to/xx.xx.xx.xx:0
at com.luhuiguo.fastdfs.conn.DefaultConnection.<init>(DefaultConnection.java:52)
at com.luhuiguo.fastdfs.conn.PooledConnectionFactory.create(PooledConnectionFactory.java:42)
at com.luhuiguo.fastdfs.conn.PooledConnectionFactory.create(PooledConnectionFactory.java:20)
at org.apache.commons.pool2.BaseKeyedPooledObjectFactory.makeObject(BaseKeyedPooledObjectFactory.java:60)
at org.apache.commons.pool2.impl.GenericKeyedObjectPool.create(GenericKeyedObjectPool.java:1064)
at org.apache.commons.pool2.impl.GenericKeyedObjectPool.borrowObject(GenericKeyedObjectPool.java:358)
at org.apache.commons.pool2.impl.GenericKeyedObjectPool.borrowObject(GenericKeyedObjectPool.java:281)
at com.luhuiguo.fastdfs.conn.ConnectionManager.getConnection(ConnectionManager.java:100)
at com.luhuiguo.fastdfs.conn.ConnectionManager.executeFdfsCmd(ConnectionManager.java:56)
at com.luhuiguo.fastdfs.service.DefaultFastFileStorageClient.uploadFileAndMetaData(DefaultFastFileStorageClient.java:72)
at com.luhuiguo.fastdfs.service.DefaultFastFileStorageClient.uploadFile(DefaultFastFileStorageClient.java:41)
环境
组件 | 版本 |
---|---|
JDK | 1.8 |
Tracker | V6.12.1 (可以通过fdfs_trackerd --version 查询) |
Storage | V6.12.1 (可以通过fdfs_storaged --version 查询) |
fastdfs-client | 0.4.0 |
解决方案
有问题首先考虑能不能在官方找到解决方案,去 FastDFS 的Git仓库 看一下有没有相同问题的 issue ,找到一条符合情形的描述。
我们可以看到作者有在这个issue下回复,要求使用最新的fastdfs-client ,但是去maven仓库一查,发现最新版本只到 1.27.2 并没有作者要求的1.32版本。
重写 TrackerClient ,设定默认的 Storage 端口 23000, 如果获取到的端口为 0 时,重置为默认端口 23000(治标不治本,如果服务端修改了strage.conf的端口,那么这个修改就失效了)。
//修复新版 FDFS 获取到的 Storage 端口为 0 的问题
@Primary
@Component("customizeTrackerClient")
public class CustomizeTrackerClient extends DefaultTrackerClient {
private static final int DEFAULT_PORT = 23000;
public CustomizeTrackerClient(TrackerConnectionManager trackerConnectionManager) {
super(trackerConnectionManager);
}
public StorageNode getStoreStorage() {
StorageNode res = super.getStoreStorage();
res.setPort(getPort(res.getPort()));
return res;
}
public StorageNode getStoreStorage(String groupName) {
StorageNode res = super.getStoreStorage(groupName);
res.setPort(getPort(res.getPort()));
return res;
}
public StorageNodeInfo getFetchStorage(String groupName, String filename) {
StorageNodeInfo res = super.getFetchStorage(groupName, filename);
res.setPort(getPort(res.getPort()));
return res;
}
public StorageNodeInfo getUpdateStorage(String groupName, String filename) {
StorageNodeInfo res = super.getUpdateStorage(groupName, filename);
res.setPort(getPort(res.getPort()));
return res;
}
private int getPort(int port){
if(port == 0){
return DEFAULT_PORT;
}
return port;
}
}