Apache Camel路由仅启动时生效一次的问题求助
问题修复思路
问题根源
你的SFTP组件默认开启了**幂等性(idempotent)**机制,哪怕设置了noop=true,它也会在第一次扫描后把所有文件标记为「已处理」,后续请求只会返回新增的文件(无新增则返回null)。内存中的已处理记录只有重启程序才会清空,所以第二次及之后调用都会统计到0。
修复方案
方案1:直接获取文件列表统计(推荐,简洁高效)
放弃循环poll的方式,直接调用SFTP的list操作获取目录下所有符合条件的文件列表,再统计数量。修改后的路由代码如下:
from("direct:fileCount") // 执行SFTP目录列表操作,获取所有匹配的文件 .to("sftp://user@192.000.00.00/uploads?password=password123&include=.*&operation=list") .process(exchange -> { // 从消息体中取出文件列表并统计数量 List<?> fileList = exchange.getIn().getBody(List.class); int count = fileList != null ? fileList.size() : 0; // 返回标准JSON格式结果 exchange.getIn().setBody("{\"fileCount\": " + count + "}"); });
这个方式每次请求都会重新扫描SFTP目录,完全不受已处理记录的影响,代码更简洁,性能也远优于循环poll的方式。
方案2:关闭SFTP幂等性(适配原有逻辑)
如果想保留你原来的循环统计逻辑,只需在SFTP的URL参数中添加idempotent=false,关闭幂等性跟踪,这样每次poll都会重新获取所有文件:
.pollEnrich("sftp://user@192.000.00.00/uploads?password=password123&noop=true&include=.*&idempotent=false",1000)
不过这种方式仅适合需要逐个处理文件的场景,单纯统计数量的话方案1是更优选择。
内容的提问来源于stack exchange,提问作者Ernesto Gómez
相关产品推荐
相关产品推荐

