错误记录》》》
在连接fastDFS(分布式文件系统),并执行文件操作(上传下载等)时,出现以下两种超时异常。而且,连续测试多次,或不同时间段测试,发现,相同的超时配置,有时超时有时不超时……
异常:
问题解决
-
这里只是分析了超时时间引发以上两种异常,因为确定了TrackerService地址是正确的。所以如果connect timed out异常,可以先看看是不是自己的TrackerService地址配错了。
-
注意在.properties和.conf配置文件中配置fastDFS超时时间是以秒为单位,通过ClientGlabal的setG_connect_timeout(int connect_timeout)和setG_network_timeout(int network_timeout)设置超时时间是以毫秒为单位即可。
-
如果偶尔超时偶尔不超时,可能是因为当前网络环境不稳定,可以将超时时间适当扩大即可。
-
connect_timeout默认5000毫秒、network_timeout默认30000毫秒。
问题分析
一、fastDFS配置信息来源
1、看过fastDFS官方文档就会知道,fastDFS提供了两种配置文件格式,.properties和.conf,并对两种配置文件都提供了对应的加载方法:
加载原 conf 格式文件配置:
ClientGlobal.init("fdfs_client.conf");
加载 properties 格式文件配置:
ClientGlobal.initByProperties("fastdfs-client.properties");
4、我们也可以直接通过setter等方法来设置来自其他地方的配置信息:
ClientGlobal.initByTrackers(String trackerServers);
ClientGlobal.setG_connect_timeout(int connect_timeout);
ClientGlobal.setG_network_timeout(int network_timeout);
我们往往会配置两种超时时间,今天遇到的问题也是这两个超时时间的事:
-
connect_timeout(连接超时):连接超时时间,针对socket套接字函数connect
-
network_timeout(网络超时):发送或接收数据时。假设在超时时间后还不能发送或接收数据,则本次网络通信失败。
二、超时时间配置
1、通过官方提供的两种配置文件格式配置(.properties 和 .conf)
我们在官网提供的两种配置文件下配置超时时间是以秒为单位配置的,ClientGlobal加载.conf配置文件方法源码如下:
可以看出,默认时间是5000毫秒和30000毫秒,它对配置文件中的超时时间进行了乘1000。所以在两种配置文件中我们只需要按秒设置超时时间即可。
2、通过调用ClientGlobal的相关setter方法来设置超时时间
直接调用ClientGlobal的setter方法来设置超时时间是以毫秒为单位,ClientGlobal的设置两个超时时间方法源码如下:
可以看出,在通过setter方法设置两种超时时间时,没有进行乘1000操作,直接将参数当做毫秒赋值。
我们在使用时,若是开发springboot项目,大多数的配置信息都会写在application.yml中,尽量保持项目中只有application.yml一个配置文件。所以,当我们把fastDFS配置信息自定义到application.yml时,会从之前或网上的.properties或.conf配置中借鉴或复制,很可能忘记修改超时时间时,直接按秒设置,结果实际就设置了几毫秒,如果网络环境不好的环境下,很容易就会导致连接超时或网络超时异常,今天碰到的就是这个原因。并不是几毫秒就一定会出现两种超时,若网络环境良好,也可以正产请求操作,只是会大概率发生超时异常罢了。