有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

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

问题: 线程正在写入linux盒中的外部装载目录。我们也遇到过其他linux挂载失败和应用程序崩溃的问题,所以我想在这个应用程序中防止这种情况

我想做的是,在写入之前,不断检查挂载(目录)是否存在。我假设如果目录关闭,它会抛出一个FileNotFoundException。如果是这样的话,我希望它在完全崩溃之前继续检查目录是否在那里10-20分钟。因为我不想再次读取10gb文件,我希望消费者线程能够从上次停止的地方恢复

我不确定最佳实践是:

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

如果我继续检查每个消费者线程中是否存在该目录,它看起来就像是可重复的代码。我可以签入主类,但创建这些文件需要30分钟。如果在30分钟内挂载失败,那么如果我只在主类中检查目录是否存在,应用程序将崩溃。或者,如果我已经在写一个目录,那么外部目录是否不可能被删除?锁上了吗

谢谢!


共 (2) 个答案

  1. # 1 楼答案

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

    我建议使用以下模式的组合:StateCircuitBreaker,我认为断路器是状态模式的更具体版本,以及Observer/Observable

    这些将以以下方式工作

    创建代表您的文件系统的东西。也许是一个叫做MountedFileSystem的类。对这个特殊的类进行所有的写调用

    该类将捕获所有FileNotFoundException,其中一个发生时,将触发CircutBreaker。这种变化将类似于国家模式。一种状态是工作“正常”,另一种状态是工作“不正常”,这意味着挂载物已经消失

    然后,在后台,我会有一个从线程开始的任务,检查实际的底层文件系统,看看它是否回来了。当文件系统返回时,更改MountedFileSystem中的状态,并触发一个事件(Observer/Observable),尝试再次将文件写入磁盘

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

  2. # 2 楼答案

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