java - instalar - ¿Cómo puedo usar OpenOffice en modo servidor como un servicio multiproceso?
openoffice windows 10 (6)
¿Cuál es la experiencia de trabajar con OpenOffice en modo servidor? Sé que OpenOffice no es multiproceso y ahora necesito usar sus servicios en nuestro servidor.
¿Qué puedo hacer para superar este problema?
Estoy usando Java.
Con la versión actual de JODConverter (3.0-SNAPSHOT), es bastante fácil manejar múltiples subprocesos de OOo en modo sin cabeza, ya que la biblioteca ahora admite iniciar varias instancias y mantenerlas en un grupo, simplemente proporcionando varios números de puerto o nombres tuberías al construir una instancia de OfficeManager:
final OfficeManager om = new DefaultOfficeManagerConfiguration()
.setOfficeHome("/usr/lib/openoffice")
.setPortNumbers(8100, 8101, 8102, 8103)
.buildOfficeManager();
om.start();
Puede utilizar la biblioteca, por ejemplo, para convertir documentos sin tener que lidiar con el grupo de instancias de OOo en segundo plano:
OfficeDocumentConverter converter = new OfficeDocumentConverter(om);
converter.convert(new File("src/test/resources/test.odt"), new File("target/test.pdf"));
Gracias Bastian . Encontré otra manera, basada en la respuesta de Bastian. Abriendo varios puertos, proporciona acceso para crear multiprocesos. Pero sin muchos puertos (suficientes varios) podemos mejorar el rendimiento al aumentar el task queue timeout
aquí es una documentación . Y una vez más, decidimos no start
y stop
officeManager
en cada proceso de conversión. Al final, resolví esta tarea con este enfoque:
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();
}
}
Llamo a JODConverter
de convertPDF
cuando se necesita conversión. Se detendrá solo cuando la aplicación se haya caído.
OpenOffice se puede usar en modo sin cabeza, pero no se ha creado para manejar muchas solicitudes en un entorno de producción estresante.
Usar OpenOffice en modo sin cabeza tiene varios problemas:
- El proceso puede morir / dejar de estar disponible.
- Hay varios problemas de fugas de memoria.
- La apertura de varios "trabajadores" de OpenOffice no se escala como se esperaba, y necesita algunas modificaciones para tener diferentes procesos abiertos (tener varias copias de OpenOffice, varios servicios, que se ejecutan bajo diferentes usuarios).
Como se sugiere, jodconverter se puede utilizar para acceder al proceso de OpenOffice.
Sí, estoy usando OpenOffice como servidor de conversión de documentos.
Desafortunadamente, la solución a su problema es generar un grupo de procesos OpenOffice.
La rama de pool commons-pool de JODConverter (antes de que se moviera a code.google.com
) implementó esto de code.google.com
para usted.
Vlad tiene razón al tener que ejecutar varias instancias de OpenOffice en diferentes puertos.
Me gustaría agregar que OpenOffice no parece ser estable. Ejecutamos 10 instancias de esto en un entorno de producción y configuramos el código para volver a intentarlo con otra instancia si el primer intento falla. De esta manera, cuando uno de los servidores de OpenOffice se bloquea (o no falla pero tampoco responde), la producción no se ve afectada. Dado que es un dolor seguir reiniciando los servidores a diario, estamos convirtiendo lentamente todos nuestros documentos a JasperReports (consulte iReport para obtener más información). No estoy seguro de cómo está utilizando el servidor OpenOffice; Lo usamos para la fusión de correos (rellenar formularios para clientes). Si necesitas convertir cosas a PDF, te recomiendo iText .
puedes probar esto
Es una biblioteca basada en Java de código abierto que le permite trabajar con documentos de oficina abiertos sin oficina abierta, eliminando así la necesidad de OOserver.