【发布时间】:2021-10-05 01:04:12
【问题描述】:
我有一个使用 java.io.FileWriter 编写文件的 java 程序。在生产环境中,该程序会被多次实例化,每个实例都会在 NFS 中的同一目录上写入一个唯一文件。有时同时有太多实例,其中一些(只有少数)因 IOException 而失败,并且消息显示为“错误:权限被拒绝”。
我认为这里的问题是目录上的并发,我想通过添加重试逻辑来解决它,无论如何它都必须写入文件。
我的想法如下,但我不知道它是否会起作用,因为我无法在我的开发环境中进行测试:
try {
fw.write(str);
} catch (IOException e) {
boolean retry = true;
while(retry) {
TimeUnit.MILLISECONDS.sleep(2);
fw.write(str);
retry = false;
}
} finally {
fw.close();
}
如果您能给我任何帮助,我将不胜感激。
【问题讨论】:
-
如果第二次写入失败并抛出
IOException,这确实会失败,因为它周围没有try。而且您应该考虑不要构建无限循环,而是最多重试 5 或 10 次。 -
谢谢@luk2302。是的,我考虑过。我也想过用 try-catch 块包围第二个写入,但我不知道在嵌套的 catch 中做什么。
-
try 需要 inside 循环,在 throwing 调用周围,没有别的:
for (int i = 0; i < 5; i++) { try { write... } catch(IOException e){ sleep... } } -
我应该在 for 循环内的某处添加一个中断吗?如果5次write语句都成功了怎么办?
-
啊,是的,当然,你应该在
write...之后休息。
标签: java concurrency permission-denied nfs filewriter