我有一个从FTP服务器读取的路由,然后处理消息。该路由具有DeadLetterChannel错误处理程序,该处理程序在处理消息时抛出异常时将消息路由到某个bean。
现在,当错误处理程序处理异常时,Camel假定一切正常,仍然删除FTP文件。
如果我删除了错误处理程序,Camel在出现异常时不会删除文件。
现在我的问题是,我怎么能有一个DeadLetterChannel错误处理程序,同时停止骆驼从删除FTP文件时处理失败?
可以设置ftp端点的选项noop=true
。然后该文件将被保留。
尽管你必须考虑如何在将来跳过拾取文件?为此,您可以使用幂等存储库来跟踪您之前处理过的文件。或者另一种选择是在完成后移动文件等。
ftp组件扩展了file组件,详见:http://camel.apache.org/file2
您有几个选项可以这样做:
- 您根本不使用
delete=true
选项,并在"成功"场景中自行处理文件的删除。这是相对透明的。 - 如果您进入DLC,您可以操纵您正在消费的端点。因此,只需为
onPrepareFailure
中的DLC定义自己的处理器。例如:deadLetterChannel("jms:dlc").onPrepareFailure(new ErrorProcessor())
之后,您可以使用getContext()
方法来获取驼峰上下文,并使用getEndpoint()
方法之一来获取消费者端点。当您拥有端点时,您可以看到哪个"进程工厂"类与getProcessStrategy
一起使用,并且可以在那里更新delete
标志以避免删除文件。对于这个端点,还可以使用方法setProcessStrategy
定义自己的"processStrategy"类。请自己看看在您的案例中使用的是哪个流程策略类。然后,您可以覆盖相应的删除方法,如deleteLocalWorkFile
,什么也不做。