2016-04-26 16 views
3

Я написал код, используя documents4j библиотеку для преобразования некоторых документов от .docx до .pdf.Как управлять LocalConverter и при вызове метода ShutDown()?

Я следовал примерам в документации, и конвертация прекрасно работает с MS-Word, но я замечаю, что после завершения преобразования и методов, результат Java-приложения все еще работает и, похоже, не выходит.

Если я явно закрывать преобразователь, используя execute() и shutDown() методы вместо schedule(), выход приложения, но мне нужно это приложение работать в параллельном режиме, поэтому я не могу явно вызывать shutDown() иначе вызываю выходы MS-Word и перерывов некоторые еще открывали документы.

Каков наилучший способ использования конвертера для достижения этих целей? LocalConverter получил способ проверить, есть ли очередь документов для преобразования? С помощью этой информации я мог бы вызвать shutDown() только с пустой очередью и создать экземпляр нового LocalConverter при следующем запросе конвертации.

Заранее благодарим за ваши ответы!

Дэн

ответ

1

Я являюсь хранителем документов4j.

Вы правы, 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, прежде чем все преобразования будут завершены.

+0

Привет Рафаэль, большое спасибо за ваш быстрый ответ. Так вы предлагаете использовать что-то вроде семафора в Set of Future, возвращенном методом schedule()? Согласно вашему предложению, мне пришлось бы использовать также некоторый механизм синхронизации этого набора. Я прав? Как вы думаете, как долго вы могли бы поделиться следующим выпуском документов4j? –

+0

Я в настоящее время довольно занят, так как я уезжаю в отпуск, но некоторое время этим летом. Однако не должно быть слишком много работы, я добавляю небольшой пример кода –

 Смежные вопросы

  • Нет связанных вопросов^_^