java - Docx4j 库不是线程安全的。解决此问题的可能方法有哪些?

标签 java multithreading concurrency thread-safety docx4j

我编写了一个应用程序,它必须从数千个大型 docx 文件中解析和检索一些数据。它将在具有许多 CPU、大量 RAM 和 RAID 阵列中的快速 SSD 的高性能生产服务器上运行,因此显然我想充分利用所有可用的性能。

我发现我的应用程序在许多并发线程中成功地完成了任何其他工作,但它无法使用 docx4j 库同时解析许多 docx 文件。此外,该库无法在许多单独的线程中安全地支持包含来自 docx 文件的数据的 WordprocessingMLPackage 类的多个实例。

谷歌搜索和检查库的源代码确认它完全不是线程安全的(例如,它的类包含许多不能同时使用的静态字段和实例)。

所以我有一些问题要问:

  • 是否有任何其他具有相同功能且保证线程安全的库?
  • 我可以在一些单独的进程而不是单独的线程中启动我的工作程序来解决这个问题吗?如果是这样,它会严重降低我的应用程序的性能吗?

最佳答案

我不知道有替代的线程安全库。

在单独的进程中启动您的工作程序是一种可行的解决方法 - 启动成本会比使用单独的线程更高,但如果您有大量文件要处理,这可能不会很重要。您需要某种方式让进程进行通信,一种选择是使用 Redis - 使用 SETNX以原子方式将文件名添加到键值存储中,如果设置成功,则工作人员可以处理该文件,如果设置不成功,则另一个进程已经在处理该文件。另一种选择是让管理进程通过套接字将文件分配给工作进程。

关于java - Docx4j 库不是线程安全的。解决此问题的可能方法有哪些?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16942014/

相关文章:

javascript - 使用 Base64 上传图像的 Struts2 Action 表单数据最大大小

java - 如何通过 GUI 按钮停止线程?

java - 你知道一个好的并发谜题网站吗?

Java 并发 - 改进读时复制集合

java - 我的 jar 文件不会加载图像

c++ - 多线程单读单写fifo队列

ios - 只有在方法完成时才继续循环

haskell - haskell channel `Control.Concurrent.Chan` 对多个读者/生产者安全吗?

java - PreparedStatement 上的 ArrayOutOfBoundsException

c# - 在单独的后台线程与进程中运行长时间后台任务