I wrote some code using documents4j
library to convert some documents from .docx
to .pdf
.
I followed the examples in the documentation and the convertion works perfectly using MS-Word, but I notice that after all conversions complete and methods return, the java application result still running and it seems not to exit.
If I explicitly close the converter using execute()
and shutDown()
methods instead of schedule()
, the application exit, but I need this application run in concurrent mode, so I can't explicitly invoke shutDown()
otherwise I cause MS-Word exits and breaks some still opened documents.
What is the best way to use the converter to achieve these objectives? Has LocalConverter
got a method to check if there is a queue of documents to be converted? With this information I could invoke shutDown()
only with an empty queue and instantiate a new LocalConverter on the next converting request.
Thanks in advance for your replies!
Dan
I am the maintainer of documents4j.
You are right, the
LocalConverter
does not currently await termination of the running conversions when it is shut down. I added a grace period that corresponds to the timeout for running conversions to finish which will be included in the next version of documents4j. I will release a new version once I have looked into a pending issue with escaping path in folders containing spaces.In the mean time, I recommend you to implement something similar yourself. Every conversion emitts a
Future
. Simply collect all the futures in aSet
and then callget
on each future in a thread. If all futures have returned (i.e. all conversions are complete), it is safe to shut down the local converter:The above is safe because all conversions are done concurrently but the main thread blocks until all futures have completed.
Future::get
blocks until its conversion has completed but returns immediately if a conversion already is complete. This way you make sure you do not reachshutDown
before all conversions are complete.