如果我试图不断检查目录是否存在,那么最佳做法是什么? JAVA

时间:2019-05-30 20:18:55

标签: java linux multithreading

我有一个创建多个线程的Java应用程序。有1个生产者线程从10gb文件读取,分析该信息,从中创建对象并将它们放入多个阻塞队列(5个队列)。

5个使用者线程的其余部分从阻塞队列中读取(每个使用者线程都有其自己的阻塞队列)。然后,使用者线程每个都写入一个单独的文件,因此总共创建了5个文件。创建所有文件大约需要30分钟。

问题: 线程正在将其写入Linux框中的外部安装目录。我们遇到了其他Linux挂载掉落且应用程序崩溃的问题,因此我想在此应用程序中避免这种情况。

我想做的就是在写入之前不断检查安装(目录)是否存在。我假设如果目录关闭,它将抛出FileNotFoundException。如果是这种情况,我希望它继续检查目录是否存在大约10-20分钟,然后完全崩溃。因为我不想再次读取10gb文件,所以我希望使用者线程能够从上次中断的地方开始。

我不确定最佳做法是:

在创建线程之前,最好检查目录是否存在于主类中吗?还是签入每个使用者线程?

如果我继续检查每个使用者线程中是否都存在该目录,那么它似乎是可重复的代码。我可以签入主类,但创建这些文件需要30分钟。如果在这30分钟内挂载失败了,那么如果Im仅在主类中检查目录是否存在,应用程序将崩溃。或者,如果我已经在写目录了,那么外部目录就不可能掉下来吗?它会被锁定吗?

谢谢

2 个答案:

答案 0 :(得分:0)

  1. 编写一种检测文件夹是否存在的方法。
  2. 在实际编写之前调用此方法。
  3. 基于2创建5个线程。一旦检测文件不存在,您似乎别无选择,只能重写。当然,如果所有内容都已经在内存中(大内存),则无需重新读取。

答案 1 :(得分:0)

我们的应用程序中有一些类似的东西,但是在我们的情况下,我们正在运行一个Web应用程序,如果挂载的文件系统出现故障,我们只会抛出一个异常,但是我们想要做得更优雅,就像您一样...

我建议结合使用以下模式:StateCircuitBreaker(我认为CircuitBreaker是State模式的更具体版本)和Observer/Observable

这些将以以下方式工作...

创建代表您的文件系统的内容。也许是一个名为MountedFileSystem的类。对该特定类进行所有写调用。

此类将捕获所有FileNotFoundException,并且发生一次,触发CircutBreaker。这种变化将类似于状态模式。一种状态是当事情在“正常”运行时,另一种状态是当事情在“正常运行”时,这意味着安装架已经消失。

然后,在后台,我将执行一个在线程上启动的任务,并检查实际的基础文件系统是否返回。当文件系统恢复时,请更改MountedFileSystem中的状态,并触发一个事件(Observer / Observable)以尝试将文件再次写入磁盘。

正如Yuan quigfei所说,我相当确定您将不得不重写这些文件。我只是看不到能够重新开始写信给他们,但是也许其他人有一个主意。