Question

Quelle est votre expérience de travail avec OpenOffice en mode serveur? Je sais qu'OpenOffice n'est pas multithread et que je dois maintenant utiliser ses services sur notre serveur.
Que puis-je faire pour surmonter ce problème?

J'utilise Java.

Était-ce utile?

La solution

Oui, j'utilise OpenOffice en tant que serveur de conversion de documents.

Malheureusement, la solution à votre problème consiste à générer un pool de processus OpenOffice.

Le commons-pool La branche de JODConverter (avant qu’elle ne soit déplacée vers code.google.com ) a implémenté cet out-of-the-box pour vous.

Autres conseils

Avec la version actuelle de JODConverter (3.0-SNAPSHOT), sa prise en main est relativement simple. plusieurs threads de OOo en mode sans tête, car la bibliothèque prend désormais en charge le démarrage de plusieurs instances et leur conservation dans un pool, en fournissant simplement plusieurs numéros de ports ou canaux nommés lors de la construction d'une instance d'OfficeManager:

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

om.start();

Vous pouvez ensuite utiliser la bibliothèque, par exemple. pour convertir des documents sans avoir à gérer le pool d'instances OOo en arrière-plan:

OfficeDocumentConverter converter = new OfficeDocumentConverter(om);
converter.convert(new File("src/test/resources/test.odt"), new File("target/test.pdf"));

Merci Bastian . J'ai trouvé un autre moyen, basé sur la réponse de Bastian. En ouvrant plusieurs ports, il fournit un accès pour créer des multithreads. Mais sans beaucoup de ports (plusieurs seulement), nous pouvons améliorer les performances en augmentant le délai de la file d'attente des tâches voici une documentation . Et encore une fois, nous avons décidé de ne pas démarrer et arrêter officeManager sur chaque processus de conversion. À la fin, j’ai résolu cette tâche par cette approche. :

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();
    }

}

J'appelle le convertPDF de JODConverter lorsque la conversion est nécessaire. Il ne sera arrêté que lorsque l'application était en panne.

OpenOffice peut être utilisé en mode sans interface graphique, mais il n’a pas été conçu pour gérer de nombreuses requêtes dans un environnement de production stressant.

L’utilisation d’OpenOffice en mode sans tête pose plusieurs problèmes:

  • Le processus peut mourir / devenir indisponible.
  • Il existe plusieurs problèmes de fuite de mémoire.
  • Ouverture de plusieurs "OpenOffice" " travailleurs " ne s'adapte pas comme prévu et nécessite quelques ajustements pour créer différents processus ouverts (avoir plusieurs copies OpenOffice, plusieurs services, s'exécutant sous différents utilisateurs.)

Comme suggéré, jodconverter peut être utilisé pour accéder au processus OpenOffice.

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

Vlad a raison de devoir exécuter plusieurs instances d'OpenOffice sur différents ports.

Je voudrais juste ajouter qu'OpenOffice ne semble pas être stable. Nous en exécutons 10 instances dans un environnement de production et configurons le code pour qu'il réessaie avec une autre instance si la première tentative échoue. Ainsi, lorsqu'un des serveurs OpenOffice se bloque (ou ne se bloque pas mais ne répond pas non plus), la production n'est pas affectée. Comme il est difficile de redémarrer quotidiennement les serveurs, nous convertissons lentement tous nos documents en JasperReports (voir iReport pour plus de détails). Je ne sais pas comment vous utilisez le serveur OpenOffice. nous l'utilisons pour la fusion de courrier (remplir des formulaires pour les clients). Si vous avez besoin de convertir des fichiers au format PDF, je vous recommanderais iText .

vous pouvez essayer ceci:

http://www.jopendocument.org/

c’est une bibliothèque open source basée sur Java qui vous permet de travailler avec des documents open office sans open office, éliminant ainsi la nécessité du serveur OO.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top