如何在Spring Boot+Kubernetes的Java项目中校验指定FTP服务器路径的文件是否存在
FTP文件存在性及完整性校验实现方案
核心实现路径(两种可选)
方案1:Spring Boot 原生集成(无需额外shell脚本)
你当前使用的是Spring Boot项目,可直接集成FTP客户端依赖完成校验,无需额外维护脚本,校验逻辑可直接和业务流程打通,K8s集群也不需要提前配置FTP相关参数,仅需将FTP连接信息通过Secret/ConfigMap注入到Pod环境变量即可。
推荐使用Apache Commons Net组件实现,核心校验逻辑示例如下:
import org.apache.commons.net.ftp.FTPClient; import org.apache.commons.net.ftp.FTPFile; import java.io.IOException; public class FtpValidator { // 以下参数从配置文件/环境变量读取 private String ftpHost; private Integer ftpPort; private String ftpUsername; private String ftpPassword; /** * 校验FTP文件是否存在且传输完成 * @param ftpFilePath FTP上文件的完整路径 * @param expectedFileSize 源PV中文件的大小,用于校验传输完整性 * @return 校验结果 */ public boolean validateFtpFile(String ftpFilePath, long expectedFileSize) { FTPClient ftpClient = new FTPClient(); try { ftpClient.connect(ftpHost, ftpPort); boolean loginSuccess = ftpClient.login(ftpUsername, ftpPassword); if (!loginSuccess) { return false; } ftpClient.enterLocalPassiveMode(); FTPFile[] targetFiles = ftpClient.listFiles(ftpFilePath); // 文件存在且大小和源文件一致,判定为传输完成 return targetFiles.length == 1 && targetFiles[0].getSize() == expectedFileSize; } catch (IOException e) { // 可根据业务需要添加异常上报逻辑 return false; } finally { try { if (ftpClient.isConnected()) { ftpClient.logout(); ftpClient.disconnect(); } } catch (IOException ignore) {} } } }
方案2:shell脚本实现(适合独立巡检场景)
如果校验逻辑不需要和Spring Boot业务流程联动,仅需要定时巡检、触发告警,可编写独立shell脚本实现,配合K8s CronJob可实现自动定时校验。脚本可通过ConfigMap挂载到Pod中,无需打包进业务镜像。
基于lftp的校验脚本示例如下:
#!/bin/bash # 配置参数从环境变量/Secret挂载的配置文件读取 FTP_HOST=${FTP_HOST} FTP_PORT=${FTP_PORT:-21} FTP_USER=${FTP_USER} FTP_PASS=${FTP_PASS} TARGET_FTP_PATH=${TARGET_FTP_PATH} EXPECTED_FILE_SIZE=${EXPECTED_FILE_SIZE} # 执行校验 ftp_file_size=$(lftp -u "${FTP_USER},${FTP_PASS}" -p "${FTP_PORT}" "${FTP_HOST}" -e "set net:timeout 10; size ${TARGET_FTP_PATH}; quit" 2>/dev/null) if [[ $? -eq 0 && "${ftp_file_size}" -eq "${EXPECTED_FILE_SIZE}" ]]; then echo "校验通过:文件存在且大小匹配" exit 0 else echo "校验失败:文件不存在或未传输完成" exit 1 fi
选型建议
- 校验结果需要支撑后续业务流程的,优先选方案1,逻辑内聚,无需额外维护任务调度
- 仅需独立监控校验、和业务流程无关的,优先选方案2,更轻量,和业务代码解耦
注意事项
FTP账号密码等敏感信息必须通过K8s Secret存储,禁止硬编码在代码、脚本或普通ConfigMap中
不要仅校验文件是否存在,需同步比对文件大小或MD5哈希值,避免NiFi还在传输过程中就被判定为已生成
内容的提问来源于stack exchange,提问作者codeDev
相关产品推荐
相关产品推荐

