Apache Camel固定文件名优化FTP文件检索性能求助
优化Apache Camel FTP文件下载性能:直接指定文件名替代目录检索
核心优化思路
跳过FTP目录遍历扫描步骤,直接通过URL参数拼接出固定格式的目标文件名,让Camel FTP组件直接请求该文件,彻底消除目录检索的耗时。
具体修改步骤
1. 调整REST参数与文件名拼接逻辑
直接从请求参数中拼接出符合固定格式的目标文件名,无需先获取FTP目录列表再过滤。例如你的固定格式是{paramA}_{paramB}.pdf,则在路由中直接构造:
// 从请求参数中获取值并拼接文件名 .setHeader("targetPdfName", simple("${header.paramA}_${header.paramB}.pdf"))
2. 修改FTP端点配置,直接指定文件名
将原来带通配符(用于目录扫描)的FTP端点,改为动态指定目标文件名的形式,避免目录遍历:
rest("/api/pdf") .get("/fetch") .param().name("paramA").type(RestParamType.query).required(true).endParam() .param().name("paramB").type(RestParamType.query).required(true).endParam() .route() // 拼接目标文件名 .setHeader("targetPdfName", simple("${header.paramA}_${header.paramB}.pdf")) // 直接请求FTP服务器上的目标文件,binary=true确保PDF传输不损坏 .to("ftp://your-ftp-user:your-ftp-pass@ftp-host/remote-storage-path?fileName=${header.targetPdfName}&binary=true") // 设置HTTP响应头,让浏览器正确识别PDF文件 .setHeader(Exchange.CONTENT_TYPE, constant("application/pdf")) .setHeader(Exchange.CONTENT_DISPOSITION, simple("attachment; filename=${header.targetPdfName}"));
3. 添加异常处理(可选但推荐)
处理文件不存在的场景,返回友好的HTTP响应:
// 在路由类中定义全局异常处理 onException(FileNotFoundException.class) .handled(true) .setHeader(Exchange.HTTP_RESPONSE_CODE, constant(404)) .setBody(constant("请求的PDF文档不存在"));
4. 验证优化效果
修改完成后,直接请求/api/pdf/fetch?paramA=xxx¶mB=yyy,此时Camel会直接向FTP服务器请求xxx_yyy.pdf文件,无需扫描整个目录,耗时会从20-25秒大幅降低到正常文件传输的耗时。
内容的提问来源于stack exchange,提问作者JustToKnow
相关产品推荐
相关产品推荐

