2016-04-26 46 views
3

我使用documents4j库编写了一些代码,将.docx中的一些文档转换为.pdf如何管理LocalConverter并调用ShutDown()方法?

我遵循文档中的例子和转换完美使用MS-Word,但我注意到,所有转换完成和方法返回后,Java应用程序结果仍在运行,它似乎不会退出。

如果我明确地关闭使用​​和shutDown()方法,而不是schedule(),应用程序退出的转换器,但我需要在并行模式下,该应用程序运行,所以我不能显式调用shutDown()否则我会MS-Word中退出和休息有些仍然打开文件。

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

在此先感谢您的答复!

回答

1

我是documents4j的维护者。

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

同时,我建议你自己实现一些类似的东西。每次转换都会生成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

+0

嗨拉斐尔,非常感谢您的快速回复。那么你是否建议在schedule()方法返回的Set of Future上使用类似信号量的东西?根据你的建议,我将不得不在该套件上使用一些同步机制。我对吗?你认为你可以分享document4j的下一个版本吗? –

+0

我目前很忙,因为我很快就要休假,但今年夏天有一段时间。但是它不应该做太多的工作,我会添加一个小代码示例 –