Как я могу использовать OpenOffice в режиме сервера в качестве многопоточного сервиса? - PullRequest
20 голосов
/ 09 марта 2009

Каков опыт работы с OpenOffice в режиме сервера? Я знаю, что OpenOffice не является многопоточным, и теперь мне нужно использовать его сервисы на нашем сервере.
Что я могу сделать, чтобы преодолеть эту проблему?

Я использую Java.

Ответы [ 6 ]

7 голосов
/ 08 ноября 2010

С текущей версией JODConverter (3.0-SNAPSHOT) довольно легко обрабатывать несколько потоков OOo в режиме без головы, поскольку библиотека теперь поддерживает запуск нескольких экземпляров и хранение их в пуле. просто указав несколько номеров портов или именованных каналов при создании экземпляра OfficeManager:

final OfficeManager om = new DefaultOfficeManagerConfiguration()
  .setOfficeHome("/usr/lib/openoffice")
  .setPortNumbers(8100, 8101, 8102, 8103)
  .buildOfficeManager();

om.start();

Вы можете использовать библиотеку, например, для преобразования документов без необходимости работать с пулом экземпляров OOo в фоновом режиме:

OfficeDocumentConverter converter = new OfficeDocumentConverter(om);
converter.convert(new File("src/test/resources/test.odt"), new File("target/test.pdf"));
5 голосов
/ 10 марта 2009

Да, я использую OpenOffice в качестве сервера преобразования документов.

К сожалению, решение вашей проблемы - создать пул процессов OpenOffice.

Ветвь commons-pool JODConverter (до того, как он перешел на code.google.com) реализовала это готово для вас.

4 голосов
/ 14 июня 2018

Спасибо Бастиан . Я нашел другой способ, основываясь на ответе Бастиана. Открытие нескольких портов обеспечивает доступ к созданию многопоточности. Но без многих портов (достаточно нескольких) мы можем улучшить производительность, увеличив task queue timeout , вот документация . И еще раз, мы решили не start и stop officeManager на каждом процессе преобразования. В конце концов, я решил эту задачу следующим способом:

public class JODConverter {

    private static volatile OfficeManager officeManager;
    private static volatile OfficeDocumentConverter converter;

    public static void startOfficeManager(){
        try {

            officeManager = new DefaultOfficeManagerConfiguration()
                    .setOfficeHome(new File('libre office home path'))
                    .setPortNumbers(8100, 8101, 8102, 8103, 8104 )  
                    .setTaskExecutionTimeout(600000L)    // for big files
                    .setTaskQueueTimeout(200000L)        // wait if all port were busy
                    .buildOfficeManager();
            officeManager.start();

            // 2) Create JODConverter converter
            converter = new OfficeDocumentConverter(officeManager);

        } catch (Throwable e){
            e.printStackTrace();
        }
    }

    public static void convertPDF(File inputFile, File outputFile) throws Throwable {

        converter.convert(inputFile, outputFile);
    }

    public static void stopOfficeManager(){
        officeManager.stop();
    }

}

Я звоню JODConverter convertPDF, когда необходимо преобразование. Он будет остановлен только тогда, когда приложение не работает.

2 голосов
/ 06 июля 2009

OpenOffice можно использовать в автономном режиме, но он не был создан для обработки большого количества запросов в стрессовой производственной среде.

Использование OpenOffice в автономном режиме имеет несколько проблем:

  • Процесс может умереть / стать недоступным.
  • Есть несколько проблем с утечками памяти.
  • Открытие нескольких «рабочих» OpenOffice не масштабируется, как ожидалось, и требует некоторой настройки, чтобы действительно иметь разные открытые процессы (с несколькими копиями OpenOffice, несколькими сервисами, работающими под разными пользователями.)

Как и предполагалось, jodconverter можно использовать для доступа к процессу OpenOffice.

http://code.google.com/p/jodconverter/wiki/GettingStarted

1 голос
/ 26 апреля 2010

Вы можете попробовать это:

http://www.jopendocument.org/

это библиотека на основе Java с открытым исходным кодом, которая позволяет работать с документами с открытым офисом без открытого офиса, что устраняет необходимость в OOserver.

1 голос
/ 14 марта 2009

Влад правильно говорит о необходимости запуска нескольких экземпляров OpenOffice на разных портах.

Я просто хотел бы добавить, что OpenOffice не выглядит стабильным. Мы запускаем 10 его экземпляров в производственной среде и настраиваем код на повторную попытку с другим экземпляром, если первая попытка не удалась. Таким образом, когда один из серверов OpenOffice выходит из строя (или не падает, но не отвечает), это не влияет на работу. Поскольку ежедневный перезапуск серверов затруднен, мы постепенно конвертируем все наши документы в JasperReports (подробнее см. IReport). Я не уверен, как вы используете сервер OpenOffice; мы используем его для слияния (заполнения форм для клиентов). Если вам нужно конвертировать вещи в PDF, я бы порекомендовал iText .

...