如何使用Apache Camel从FTP服务器下载CSV文件?
解决Apache Camel FTP下载CSV时的类型转换错误
问题分析
你遇到的No type converter available to convert from type: java.lang.Integer to the required type: java.io.InputStream with value -1错误,根源主要有两个:
- 路由定义违规:你的代码里连续写了两个
from(),这不符合Apache Camel的路由规则。from()是用来定义路由起始端点的,一个路由只能有一个起始点,连续两个from()会打乱Camel的消息流处理逻辑,最终触发类型转换异常。 - FTP文件读取异常:错误中的
-1通常是FTP组件读取文件时返回的异常信号,可能意味着目标文件不存在、FTP账号权限不足,或者FTP连接模式(比如需要被动模式)配置不正确。
修复后的方案1代码
根据你“下载指定CSV到本地”的需求,提供两种正确的写法:
写法1:通过Direct端点触发下载
如果你需要外部触发(比如调用direct://start)来执行下载操作,应该用pollEnrich来整合FTP端点:
from("direct://start") // 从FTP拉取指定文件,添加被动模式适配多数服务器 .pollEnrich("ftp://user@ftpserver/Directory?password=secret&fileName=a-b-c-2018-04-16.csv&passiveMode=true") // 保存到本地目录 .to("file://dir");
写法2:FTP自动轮询下载
如果不需要外部触发,希望Camel自动监听FTP目录并下载指定文件,可以直接把FTP作为路由起始点:
from("ftp://user@ftpserver/Directory?password=secret&fileName=a-b-c-2018-04-16.csv&passiveMode=true") .to("file://dir");
额外排查建议
- 验证文件与权限:确认FTP服务器上
Directory目录下确实存在a-b-c-2018-04-16.csv,且你的FTP账号拥有该文件的读取权限。 - 强制被动模式:大多数现代FTP服务器需要被动模式才能正常传输文件,建议始终添加
passiveMode=true参数。 - 开启DEBUG日志:打开Camel的DEBUG级别日志,能看到FTP组件与服务器的交互细节,更容易定位连接、登录或文件读取阶段的问题。
如果你的方案2也遇到了问题,可以补充具体代码和错误信息,我再帮你分析。
内容的提问来源于stack exchange,提问作者Tanmay Grover
相关产品推荐
相关产品推荐

