有 2 个 Spring Boot 服务实例读取来自特定位置的文件。如果在该位置添加新文件,则两个服务会一起读取该文件。目标是两个实例应该并行处理新文件。
我已经尝试过锁定机制。它锁定文件,一个实例读取一个文件,但第二个实例在锁释放之前不会读取任何新文件。
最佳答案
我会遵循下面的简单选项之一。
保留已处理文件的列表:其想法是将已处理文件的完整路径写入另一个文件、数据库表甚至内存空间中。 首先读取文件的服务将首先在该空间中创建一个条目。这是为了标记文件。其他服务在开始处理新创建的文件之前会查找文件的路径。但由于它已经存在,因此它将无法继续。
移动已处理的文件:创建一个文件夹来存档已处理的文件。服务读取文件时首先将文件移动到那里并进行处理。其他服务将无法读取该文件。顺便说一句,如果不允许您移动文件,此选项可能不可行。在这种情况下,请尝试制作该文件的副本。
复制处理后的文件:与 item#1 类似。在文件夹中复制文件。服务读取文件时首先将文件复制到那里并继续。其他服务在该复制文件夹中查找文件的名称(或其他标识符)。由于它已经存在,因此它将无法继续。
可以生成许多其他变体,但基本思想是标记该文件路径,以便它已被处理或正在进行。
请注意,如果无法完成对文件的处理,则必须回滚。根据您选择的选项,您需要删除列表中的记录或将文件移回原始目录中或删除该文件的副本。
关于java - 如何通过 Springboot 服务的 2 个实例从共享位置并行访问文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56630248/