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



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

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

问题:线程正在写入 linux 框中的外部挂载目录。我们遇到了其他 linux 挂载出现故障和应用程序崩溃的问题,因此我想在此应用程序中防止这种情况发生。

我想做的是在写入之前继续检查挂载(目录)是否存在。我假设如果目录出现故障,它将抛出一个FileNotFoundException。如果是这种情况,我希望它在完全崩溃之前继续检查目录是否存在大约 10-20 分钟。因为我不想再次读取 10gb 文件,所以我希望使用者线程能够从上次停止的地方继续。

我不确定最佳做法是:

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

如果我继续检查每个使用者线程中是否存在该目录,它似乎是可重复的代码。我可以签入主类,但创建这些文件需要 30 分钟。如果在这 30 分钟内挂载出现故障怎么办,那么如果我只在主类中检查目录是否存在,应用程序将崩溃。或者,如果我已经写入目录,外部目录是否无法关闭?它会被锁定吗?

谢谢

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

我建议使用以下模式的组合:State,Breaker,我相信Breaker是状态模式的更具体版本,以及Observer/Observable。

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

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

这个类将捕获所有FileNotFoundException,并且发生一个,CircutBreaker被触发。 此更改将类似于状态模式。 一种状态是当事情"正常"时,另一种状态是当事情"运行不正常"时,这意味着坐骑已经消失了。

然后,在后台,我将有一个任务,该任务在线程上启动并检查实际的底层文件系统以查看它是否返回。 当文件系统恢复时,更改挂载文件系统中的状态,并触发事件(观察者/可观察)以尝试将文件再次写入磁盘。

正如袁奎格菲所说,我相当确定你将不得不重写这些文件。 我只是看不到能够重新给他们写信,但也许其他人有一个想法。

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

最新更新