Domanda

Qual è l'esperienza di collaborazione con OpenOffice in modalità server? So che OpenOffice non è multithread e ora ho bisogno di usare i suoi servizi sul nostro server.
Cosa posso fare per superare questo problema?

Sto usando Java.

È stato utile?

Soluzione

Sì, sto usando OpenOffice come server di conversione di documenti.

Sfortunatamente, la soluzione al tuo problema è generare un pool di processi OpenOffice.

Il commons-pool branch di JODConverter (prima che si spostasse su code.google.com ) ha implementato questo out-of-the-box per te.

Altri suggerimenti

Con l'attuale versione di JODConverter (3.0-SNAPSHOT), è abbastanza facile da gestire più thread di OOo in modalità senza testa, poiché la libreria ora supporta l'avvio di diverse istanze e il loro mantenimento in un pool, fornendo semplicemente diversi numeri di porta o pipe denominate durante la costruzione di un'istanza di OfficeManager:

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

om.start();

Puoi quindi usarci la libreria, ad es. per convertire documenti senza dover gestire il pool di istanze OOo in background:

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

Grazie Bastian . Ho trovato un altro modo, basato sulla risposta di Bastian. Aprendo diverse porte fornisce l'accesso per creare multithread. Ma senza molte porte (abbastanza diverse) possiamo migliorare le prestazioni aumentando timeout della coda attività ecco una documentazione . E ancora una volta, abbiamo deciso di non start e stop officeManager su ogni processo di conversione. Alla fine, ho risolto questo compito con questo approccio :

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

}

chiamo JODConverter il convertPDF quando è necessaria la conversione. Verrà arrestato solo quando l'applicazione era inattiva.

OpenOffice può essere utilizzato in modalità headless, ma non è stato creato per gestire molte richieste in un ambiente di produzione stressante.

L'uso di OpenOffice in modalità senza testa presenta diversi problemi:

  • Il processo potrebbe morire / diventare non disponibile.
  • Esistono diversi problemi di perdite di memoria.
  • Apertura di più OpenOffice " lavoratori " non si ridimensiona come previsto e necessita di alcune modifiche per avere realmente diversi processi aperti (con diverse copie di OpenOffice, diversi servizi, in esecuzione con utenti diversi).

Come suggerito, jodconverter può essere usato per accedere al processo OpenOffice.

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

Vlad ha ragione a dover eseguire più istanze di OpenOffice su porte diverse.

Vorrei solo aggiungere che OpenOffice non sembra stabile. Ne eseguiamo 10 istanze in un ambiente di produzione e impostiamo il codice per riprovare con un'altra istanza se il primo tentativo fallisce. In questo modo quando uno dei server OpenOffice si arresta in modo anomalo (o non si arresta ma non risponde neanche) la produzione non viene influenzata. Poiché è un problema continuare a riavviare i server quotidianamente, stiamo lentamente convertendo tutti i nostri documenti in JasperReports (vedi iReport per i dettagli). Non sono sicuro di come stai usando il server OpenOffice; lo usiamo per la fusione della posta (compilando moduli per i clienti). Se hai bisogno di convertire cose in PDF, ti consiglio iText .

puoi provare questo:

http://www.jopendocument.org/

è una libreria open source basata su Java che ti consente di lavorare con documenti open office senza open office, eliminando così la necessità di OOserver.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top