Camel SFTP无法监听文件修改与删除事件求助
解决Camel SFTP仅触发文件创建事件的问题
一、监听文件修改事件
当前配置里的noop=true会让Camel把已处理文件存入幂等仓库,后续文件修改不会再触发。要捕获修改事件,需调整SFTP URI参数:
- 移除
noop=true,添加fileChanged=true开启文件修改检测,同时设置轮询间隔delay(比如5秒,按需调整):
String uri = "sftp://test.remoteadd.cc/opt/tomcat/webapps/file-watch?privateKeyFile=src/main/resources/keypair.pem&recursive=true&download=true&stepwise=false&useUserKnownHostsFile=false&username=ubuntu&binary=true&streamDownload=true&fileChanged=true&delay=5000";
- 若要确保文件修改完成后再处理(避免处理未写完的文件),可配合
readLock=changed和readLockCheckInterval:
String uri = "sftp://test.remoteadd.cc/opt/tomcat/webapps/file-watch?privateKeyFile=src/main/resources/keypair.pem&recursive=true&download=true&stepwise=false&useUserKnownHostsFile=false&username=ubuntu&binary=true&streamDownload=true&fileChanged=true&delay=5000&readLock=changed&readLockCheckInterval=2000";
二、监听文件删除事件
Camel SFTP原生不支持直接捕获删除事件,需自定义逻辑实现:
- 在
RemoteFileWatcherEventProcessor中用ConcurrentHashMap维护已发现的远程文件路径缓存。 - 每次轮询时,通过Camel的
GenericFileOperationsAPI获取当前远程目录的完整文件列表。 - 对比当前列表与缓存,找出缓存存在但当前列表缺失的文件,判定为已删除,触发对应处理逻辑。
- 更新缓存为最新的文件列表。
三、调整后的路由示例
RouteBuilder rb = new RouteBuilder() { @Override public void configure() throws Exception { from(uri) .routeId(routeHandlerId) .setHeader("fileName").simple("${file:name}") .setHeader("fileEventType").simple("${file:changed} ? 'MODIFIED' : 'CREATED'") .bean(RemoteFileWatcherEventProcessor.class, "process(${body}, ${headers})") .to("file:/opt/test.cc/tomcat/webapps?fileName=${body.fileName}&autoCreate=true"); } };
在RemoteFileWatcherEventProcessor中集成上述删除事件检测逻辑,即可同时处理创建、修改、删除三种事件。
内容的提问来源于stack exchange,提问作者Amit Mishra
相关产品推荐
相关产品推荐

