Apache POI 在多线程中的 tmp 目录上获取 java.io.IOException

问题描述 投票:0回答:3

我有一个 Java 应用程序,它收到创建 XLSX 文件的请求。
该应用程序是多线程的,这意味着 5 个用户可以同时运行报告。
我的问题是,当报告很大且 5 个用户一起创建报告时,我收到此消息

java.io.IOException: Could not create temporary directory '
这可能是因为 5 个线程之一删除了 java.tmp.dir 而其他 4 个线程失败了。

我该如何解决这个问题?
我建议的解决方案之一是为每个线程提供不同的 java.io.tmpdir,这是可以做到的吗?

java multithreading apache apache-poi
3个回答
1
投票

一种解决方案是在创建临时目录时,线程应附加一些前缀来唯一标识。因此,不会对同一文件夹进行并发修改。

在实现时你必须考虑可以同时处理多少个请求。你不能创建很多目录。

如果请求超出您的处理能力,一种解决方案是使用线程池和队列来保存请求。

或者如果内容相似,那么您可以创建一个模板并动态更改一些数据。所以只有克隆才有效


1
投票

我可能会首先检查您的与写入这些 .xlsx 文件相关的方法是否是线程安全的。 而且你的头可能会竞相同时写入相同的文件。


0
投票

我的解决方案是禁止 POI 在空时删除目录(来自 https://bz.apache.org/bugzilla/show_bug.cgi?id=57200#c4

touch /tmp/poifiles/.dontdeleteonexitonnonuniquedirectories
© www.soinside.com 2019 - 2024. All rights reserved.