2012-01-12 21 views
7

Uso la API de OpenOffice de mi Programa Java para manejar Documentos para mí. A veces (una vez cada 100k llamadas) el método de eliminación de un Documento no retorna, la carga de la CPU se mantiene al 100% pero nada parece a suceder.Java: el método no regresa. (XComponent.dispose

¿Cómo debería actuar/código correctamente en esta situación?

Mi enfoque actual es esperar a que el disponer para tener éxito durante dos segundos. Si no es así que trato de poner fin a OpenOffice a través de la API apropiada Si eso también falla (como era de esperar), entonces elimino el proceso de soffice con una llamada al

XDesktop xDesk = (...) // achive desktop 
xDesk.terminate(); 
Runtime.getRuntime().exec("pkill soffice"); // "taskkill /IM soffice" on windows 

y luego llamar

disposeThread.stop(); 

a la rosca que en un principio intenta disponer el XComponent. Ahora, la API de Java dice que no se debe usar Thread.stop() (y hay argumentos válidos para eso), así que me pregunto si hay alguna solución mejor que lo que hice.

+0

Esta es una de esas preguntas en las que, dependiendo de cómo esté redactada, podría ser adecuada para los programadores, pero creo que es técnica y de implementación lo suficientemente específica como para que probablemente deba estar en StackOverflow. –

+0

@maple_shaft Pensé en eso, pero decidí no hacerlo. Si fuera una pregunta sobre cómo manejar mi problema específico, lo habría puesto allí, pero ya encontré una solución de trabajo para mi problema y ahora estoy preguntando si hay un concepto mejor, en lugar de una solución específica. Pero sí, depende de cómo esté redactado. –

+0

@RobZ Esto realmente no es una pregunta específica de Open Office. Mi situación de Open Office aquí es solo un ejemplo. –

Respuesta

4

Parece que tiene algunas formas bastante novedosas para solucionar un raro error extraño.

La forma en que lo veo es que, aunque la API de Java indica que Thread.stop() no se debe utilizar, lo mismo se puede decir que el OpenOffice Document.dispose() siempre debe devolver. Incluso si es una ocurrencia rara, sigue siendo un error, ya que no termina y devuelve un valor ni arroja una excepción debido a un estado no válido. Simplemente se ejecuta en un bucle infinito, por lo tanto, es un error.

Como se trata de una solución, no veo problemas con el uso de Thread.stop() si necesita evitar que su aplicación se cuelgue. La cláusula de exención de responsabilidad sobre por qué no debe utilizarse tiene más el objetivo de prevenir aplicaciones de subprocesos múltiples poco desarrolladas, ya que puede ser objeto de abusos.

+1

Gracias por su respuesta, esperé más de un mes para ver si alguien podía tener una mejor idea, pero desafortunadamente no ... Mi solución actual es usar comandos del sistema (ps y kill) para terminar OOo en este situación porque se cuelga totalmente. Parece un gran desastre :(De todos modos, marcaré tu respuesta como correcta, gracias de nuevo. –

Cuestiones relacionadas