You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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&paramB=yyy,此时Camel会直接向FTP服务器请求xxx_yyy.pdf文件,无需扫描整个目录,耗时会从20-25秒大幅降低到正常文件传输的耗时。

内容的提问来源于stack exchange,提问作者JustToKnow

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 12:20:27