应使用FTP2或SFTP组件替代File组件实现远程XML文件轮询,因File组件不支持FTP/SFTP协议;可选直接消费者、PollingConsumer手动轮询、本地中转或密钥认证+流式解析四种方式。

如果您希望使用Apache Camel的File组件从FTP或SFTP服务器轮询XML文件并进行处理,需注意File组件本身不支持远程协议,必须配合FTP2或FTPS/SFTP组件实现。以下是多种可行的集成方式:
一、使用camel-ftp组件替代File组件直接轮询
Camel的ftp和sftp组件原生支持远程目录轮询,可直接作为消费者端接入,无需File组件参与。该方式避免协议不匹配问题,且支持XML文件内容解析与路由。
1、在Maven中添加依赖:camel-ftp 或 camel-jsch(用于SFTP)。
2、定义FTP消费者URI:ftp://user@host:21/inbox?password=pass&binary=true&include=.*\\.xml&move=processed/${file:name}。
3、在RouteBuilder中配置:from("ftp://...").unmarshal().jacksonXml().process(...)。
4、启用连接池与重连策略:设置connectTimeout=30000、readTimeout=60000及maximumReconnectAttempts=3。
二、使用PollingConsumer模式配合SFTP组件手动轮询
当需要精细控制轮询时机(如按固定间隔触发而非持续监听)时,可借助Camel的PollingConsumer接口,通过定时任务驱动SFTP端点拉取文件,规避自动消费者生命周期管理限制。
1、声明SFTP端点:sftp://user@host:22/data/xml?password=secret&fileName=*.xml&recursive=true。
2、在Processor中获取PollingConsumer实例:PollingConsumer consumer = endpoint.createPollingConsumer()。
3、调用receive()方法获取Exchange,检查getIn().getBody(byte[].class)是否为有效XML字节流。
4、成功处理后执行显式移动:to("sftp://user@host:22/data/processed?password=secret&fileName=${file:name}")。
三、结合File组件与Local Staging Directory中转
若必须使用File组件逻辑(如复用现有File路由模板),可先将远程XML文件同步至本地临时目录,再由File组件消费。该方案解耦协议差异,但增加磁盘IO与同步延迟。
1、配置定时SFTP下载路由:from("timer://pull?period=60000").to("sftp://...?localWorkDirectory=/tmp/staging")。
2、确保本地目录权限可读写,并启用moveExisting=true防止重复拉取。
3、File组件路由监听该目录:from("file:/tmp/staging?include=.*\\.xml&noop=false&move=.done/${file:name}")。
4、在处理前校验XML格式:validate(header("CamelFileName").endsWith(".xml")),并使用validator DSL验证XML Schema。
四、启用SFTP连接的密钥认证与XML流式解析
针对生产环境安全要求,SFTP应禁用密码登录,改用私钥认证;同时对大XML文件避免全文加载内存,采用StAX解析器流式提取关键字段。
1、配置JSCH密钥路径:sftp://user@host:22/xml?privateKeyFile=/etc/certs/id_rsa&privateKeyFilePassphrase=phrase。
2、设置streamDownload=true启用流式下载,避免临时文件写入。
3、使用stax数据格式绑定:unmarshal().stax(MyXmlRoot.class),其中MyXmlRoot为JAXB注解类。
4、捕获SFTP连接异常并路由至死信队列:onException(SftpException.class).handled(true).to("jms:queue:dlq.sftp")。









