java如何处理每10秒钟通过ftp接收的50K文件
我有5万台机器,每台机器都有一个唯一的id。 每10秒,机器将在位于ftp服务器的机器订阅源目录中发送一个文件。并非所有文件都同时接收
计算机将使用其id名称创建文件。 我需要处理所有收到的文件。若文件并没有在短时间内处理,那个么机器将发送新文件,覆盖现有文件,我将丢失现有数据
我的解决方案是
我已经创建了spring boot应用程序,它包含一个每1毫秒执行一次的调度程序,它将重命名接收到的文件,并将其复制到processing dir。当前日期时间将附加到每个文件
我还有一个用ApacheCamel编写的作业,它将每隔500毫秒轮询从processnig位置接收到的文件,并对其进行处理,并在数据库中插入数据。如果收到错误,它将在错误目录中移动文件
文件不大。它只包含一行信息
问题是,如果文件更少,那么它就做得很好。如果文件数量增加,则尽管文件有效,但它仍在错误文件夹中移动
当camel轮询文件时,找到长度为零的文件,然后将该文件复制到错误目录,然后它包含有效数据。有些人认为camel正在轮询未完全复制的文件
有谁知道这个问题的好办法吗
提前谢谢
# 1 楼答案
我以前也遇到过类似的问题,但我使用了一套稍微不同的工具
我建议大家看看Apache Flume——这是一个轻量级java进程。这是我在我的情况下使用的。文档非常不错,所以你应该能够找到自己的方法,但我只是想简单介绍一下,让你开始
水槽有3个主要组件,每个组件都可以通过各种方式进行配置:
还有其他可选组件,比如拦截器,它主要用于拦截流和执行基本过滤、转换等
每一个都有各种各样的选项可供选择,但如果没有一个可用的选项适合您的用例,您可以编写自己的组件
现在,针对你的情况——以下是我可以想到的几个选项:
因此,我们的想法是拿起文件并将其交给处理目录,然后使用Apache Camel继续处理,就像您已经在做的那样
水槽设置可能如下所示:
如果您确实需要编写一个自定义组件(拦截器或接收器),您可以查看其中一个默认组件的源代码以供参考。这是link to the source code repository
我知道我提出了一个全新的工具,这与我的想法略有不同,但这对我来说非常有效,因为该工具是一个重量非常轻的工具,具有相当简单的设置和配置
我希望这有帮助