具有多个JVM的Java文件监视程序监视传入文件的单个目录

具有多个JVM的Java文件监视程序监视传入文件的单个目录,java,spring-integration,high-availability,file-watcher,Java,Spring Integration,High Availability,File Watcher,有一种情况是,有两个java应用程序正在监视一个目录中的传入文件。假设有一个目录DIR,它由两个JVM进程监视任何扩展名为.SGL的文件 我们在这里面临的问题是,有时两个节点都会收到关于新文件的通知,并且两个节点都试图处理同一个文件 通常,我们使用一个数据库来处理这些情况,该数据库尝试插入到具有唯一文件名列的表中,并且只有一个会成功并继续处理 但对于这种情况,我们没有数据库 处理此类问题的最佳方法是什么?我们可以依赖文件重命名解决方案吗?文件重命名是原子操作吗?每次添加新文件时,都应该通知每个观

有一种情况是,有两个java应用程序正在监视一个目录中的传入文件。假设有一个目录DIR,它由两个JVM进程监视任何扩展名为.SGL的文件

我们在这里面临的问题是,有时两个节点都会收到关于新文件的通知,并且两个节点都试图处理同一个文件

通常,我们使用一个数据库来处理这些情况,该数据库尝试插入到具有唯一文件名列的表中,并且只有一个会成功并继续处理

但对于这种情况,我们没有数据库

处理此类问题的最佳方法是什么?我们可以依赖文件重命名解决方案吗?文件重命名是原子操作吗?

每次添加新文件时,都应该通知每个观察者(即使是同一JVM中的两个观察者)

如果你想分工合作,你可以

  • 使用一个JVM运行两倍的线程,并通过队列分配工作
  • 使用仅对一个JVM成功的操作。例如
    • 文件重命名
    • 创建一个锁文件
    • 锁定文件本身
文件重命名是原子操作吗


是的,只有一个进程可以成功重命名一个文件,即使两个进程都试图重命名为相同的名称。

对于这种情况,Spring Integration建议
FileSystemTempersistentAcceptonCefliesFilter

  • 将“看到的”文件存储在元数据存储中,以在应用程序重新启动后继续生存
  • 默认键为“prefix”加上绝对文件名;值是文件的时间戳
  • 如果文件存在于存储中且具有
  • 与当前文件的修改时间相同
当您为所有应用程序实例共享持久
元数据存储时,只有一个实例将处理该文件。所有其他人都会过滤它