通过一个管理端配置流程,在一个agent(来源端)扫描文件,传递到另一个agent(目的端):
问题1.来源端文件被占用,不可读
描述:文件扫描是可以扫描到该文件的,但该文件可能正在写入或者修改,此时会导致读取文件失败,
解决:约定文件名,如果正在写入的文件应为特别的后缀。准备发送文件前,应获取文件读权限,如果不能获取,则暂时不要进入发送队列。
问题2.已进入发送队列的文件被删除
描述:文件之前已获得了读取权限,但在正式发送的过程中,文件被删除或读取失败。
解决:若文件不能读,则需要进行延迟发送,重新发送时要比较文件大小或MD5,因为文件可能已经变化了。
再次重试文件可能,依旧不能读取,此时需要记录错误日志,并停止该文件的发送
问题3.目的端文件系统不可写
描述:文件达到目的端时,文件系统可能已经满了,或者挂载丢失
解决:应主动跳过该文件,并记录失败日志。停止该文件的发送。
问题4.断点续传
描述:因可能存在超大文件,如果网络断连或者系统重启,则需要进行续传,而不能重新发送整个文件
解决:记录文件已发送的大小,但可能存在丢包的问题,故只能记录目的端已确认接收的部分,如果文件不完整,则需要重发未确认的部分,而不是只发没有发完的部分。
问题5:补发问题
描述:若文件发送过程中存在失败、超时。发送端需要重发,但是接收端就可能多次接收到相同的文件或文件块
解决:需要在接收端考虑去重处理
问题6:目录软链接问题
描述:如果目录使用了软链接,则使用file.getAbsolutePath()获取的是文件的真实路径,这样在记录日志时与用户配置的不同。
解决:需要使用file.getCanonicalPath()进行获取,但要特别注意,文件初始化路径时,不能包含../等信息。需要使用FilenameUtils.normalize(file.getCanonicalPath(), true)处理