3

我使用库编写了一些代码documents4j来将一些文档.docx.pdf.

我按照文档中的示例使用 MS-Word 进行了完美的转换,但我注意到在所有转换完成并且方法返回之后,java 应用程序结果仍在运行并且似乎没有退出。

execute()如果我使用andshutDown()方法而不是显式关闭转换器schedule(),则应用程序退出,但我需要此应用程序在并发模式下运行,所以我不能显式调用,shutDown()否则我会导致 MS-Word 退出并破坏一些仍然打开的文档。

使用转换器实现这些目标的最佳方式是什么?有LocalConverter没有办法检查是否有要转换的文档队列?有了这些信息,我只能用一个空队列调用shutDown()并在下一个转换请求时实例化一个新的 LocalConverter。

提前感谢您的回复!

4

1 回答 1

1

我是documents4j的维护者。

您是对的,LocalConverter当它关闭时,当前不会等待正在运行的转换终止。我添加了一个宽限期,该宽限期对应于运行转换以完成的超时,它将包含在下一个版本的documents4j 中。一旦我调查了包含空格的文件夹中的转义路径的未决问题,我将发布一个新版本。

同时,我建议您自己实现类似的东西。每次转换都会发出一个Future. 只需收集 a 中的所有期货,Set然后get在线程中调用每个期货。如果所有期货都返回(即所有转换都完成),关闭本地转换器是安全的:

IConverter converter = ...;
Set<Future<?>> futures = new HashSet<>();
for ( ... ) {
  futures.add(converter.from(...).to(...).schedule());
}
for (Future<?> future : futures) {
  future.get();
}
converter.shutDown();

以上是安全的,因为所有转换都是同时完成的,但主线程会阻塞,直到所有期货都完成。Future::get阻塞直到其转换完成,但如果转换已经完成,则立即返回。这样,您可以确保shutDown在所有转换完成之前不会到达。

于 2016-04-27T08:11:58.923 回答