FastDFS - 无法获取服务端连接资源:can‘t create connection to/xx.xx.xx.xx:0

问题描述

根据官方文档 安装完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;
    }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容