Java 大文件处理-从故障点恢复

Java 大文件处理-从故障点恢复,java,apache-camel,Java,Apache Camel,我们必须处理大型CSV文件。我们使用apachecamel从SFTP位置读取文件(但如果有更好的方法,我们会接受基于Java的解决方案) 要求之一是从故障点恢复处理。也就是说,如果在处理第1000行时发生异常,我们应该从第1000行开始处理,而不是从头开始。我们不应该同时处理记录两次 我们使用ApacheActiveMQ将记录保存在队列中并管理管道。但是,从该位置初始加载文件也可能导致失败 为了跟踪状态,我们使用了一个数据库,该数据库将在每一步使用ApacheCamel进行更新 我们愿意听取意见

我们必须处理大型CSV文件。我们使用apachecamel从SFTP位置读取文件(但如果有更好的方法,我们会接受基于Java的解决方案)

要求之一是从故障点恢复处理。也就是说,如果在处理第1000行时发生异常,我们应该从第1000行开始处理,而不是从头开始。我们不应该同时处理记录两次

我们使用ApacheActiveMQ将记录保存在队列中并管理管道。但是,从该位置初始加载文件也可能导致失败

为了跟踪状态,我们使用了一个数据库,该数据库将在每一步使用ApacheCamel进行更新

我们愿意听取意见和建议。提前感谢。

据我所知,无法从故障点恢复

如果在下一次尝试(但从一开始)移动或重新处理失败的文件,这取决于您的配置(请参见
moveFailed
选项)

要读取CSV文件,您需要输入单行。因为您的文件很大,所以应该使用拆分器的
流式处理
选项。否则,在拆分之前将读取整个文件

为了减少整个文件的失败和重新处理的可能性,您可以简单地将每个CSV行发送到ActiveMQ(无需对其进行解析)。拆分器越简单,由于单个记录中的问题而需要重新处理整个文件的可能性就越低

队列的解耦使用者可以在不影响文件导入的情况下解析和处理CSV记录。这样,您就可以处理每条记录的错误

如果仍然存在文件导入失败,则会从一开始重新处理该文件。所以你应该。例如,检查现有记录,如果已经有记录,则更新它,而不是插入所有记录


在消息传递环境中,您必须处理。唯一的解决方案是使用幂等分量。即使Camel尝试在故障点恢复,它也不能保证每个记录只读取一次。

只需使用insert/updates,即upserts/merge和threads。我已经在大约4分钟内将260GB的csv文件处理到一个MYSQL数据库中。别忘了工程师。哇!真令人印象深刻。你能告诉我一些细节吗?您使用的处理方式和解决方案是什么?如果你在答案部分加上它,我可以接受这个答案,并且可以给分。谢谢谢谢Burki,这很有道理。Camel本身有一个幂等EIP,我想我们可以使用它。