具有多个JVM的Java文件监视器,用于查看传入文件的单个目录

时间:2017-09-28 14:49:24

标签: java spring-integration high-availability file-watcher

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

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

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

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

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

2 个答案:

答案 0 :(得分:1)

应始终通知每个观察者(即使是同一个JVM中的两个)正在添加的新文件。

如果你想分工,你可以

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

文件重命名是原子操作吗?

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

答案 1 :(得分:1)

对于这种情况,Spring Integration建议MetadataStorehttp://csharpindepth.com/Articles/General/Singleton.aspx

  
      
  • 在MetadataStore中存储“已查看”文件,以便在应用程序重新启动后继续存在。
  •   
  • 默认密钥是'prefix'加上绝对文件名; value是文件的时间戳。
  •   
  • 如果文件存在于商店并且具有
  • ,则视为已经“看到”   
  • 与当前文件相同的修改时间。
  •   

当您为所有应用程序实例共享持久性void Speed(String num) { Serial.println("NUM="+num); BigNumber NUM = num.c_str();//this is where it fails BigNumber Curr = "1";//start 2 / 'curr++' start of loop num = ""; ... the testing of prime numbers here 时,只有其中一个将处理该文件。所有其他人只会过滤它。