【问题标题】:How to manage LocalConverter and when invoke ShutDown() method?如何管理 LocalConverter 以及何时调用 ShutDown() 方法?
【发布时间】:2016-08-20 11:38:25
【问题描述】:

我使用documents4j 库编写了一些代码,将一些文档从.docx 转换为.pdf

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

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

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

提前感谢您的回复!

【问题讨论】:

    标签: java pdf docx pdf-conversion documents4j


    【解决方案1】:

    我是documents4j的维护者。

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

    同时,我建议您自己实现类似的东西。每次转换都会发出一个Future。只需在 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

    【讨论】:

    • 您好 Rafael,非常感谢您的快速回复。那么您是否建议在 schedule() 方法返回的 Set of Future 上使用信号量之类的东西?根据您的建议,我还必须在该 Set 上使用一些同步机制。我对吗?您认为您可以在多长时间内分享下一个documents4j 版本?
    • 我现在很忙,因为我很快就要去度假了,但今年夏天有一段时间。不过应该不会做太多工作,我添加一个小代码示例
    猜你喜欢
    • 2017-10-31
    • 1970-01-01
    • 2011-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多