2012-01-12 20 views
7

Uso l'API OpenOffice dal mio programma Java per gestire Documenti per me. A volte (una volta ogni 100k circa) il metodo di smaltimento di un documento non viene restituito, il carico della CPU rimane al 100% ma non sembra nulla per accadere.Java: il metodo non restituisce. (XComponent.dispose

Come dovrei agire/codice correttamente in questa situazione?

il mio approccio attuale è quella di aspettare la dispose per avere successo per due secondi. in caso contrario cerco di interrompere OpenOffice attraverso l'API appropriata Se ciò fallisce pure (come mi aspetterei) allora uccido il processo di soffice con una chiamata a

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

e quindi chiamare

disposeThread.stop(); 

al thread che cerca inizialmente di disporre il XComponent. Ora l'API Java dice che non si dovrebbe usare Thread.stop() (e ci sono argomenti validi per quello) quindi mi chiedo se ci sono soluzioni migliori di ciò che ho fatto.

+0

Questa è una di quelle domande in cui, a seconda di come è formulata, potrebbe essere appropriata per i programmatori, ma ritengo che sia tecnica e di implementazione abbastanza specifica che dovrebbe probabilmente essere su StackOverflow. –

+0

@maple_shaft Ci ho pensato, ma ho deciso contro. Se fosse una domanda su come gestire il mio problema specifico, l'avrei messo lì, ma ho già trovato una soluzione funzionante per il mio problema e ora sto chiedendo se c'è un concetto migliore, piuttosto che una soluzione specifica. Ma sì, dipende da come è formulata. –

+0

@RobZ Questa non è una domanda specifica di Open Office. La mia situazione di Open Office qui è solo un esempio. –

risposta

4

Sembra che tu abbia dei modi abbastanza nuovi per aggirare uno strano bug raro.

Il modo in cui lo vedo è che mentre l'API Java indica che non deve essere utilizzato, lo stesso si può dire che l'OpenOffice Document.dispose() dovrebbe sempre restituire. Anche se si tratta di un evento raro, è ancora un bug, in quanto non finisce e restituisce un valore né genera un'eccezione a causa di uno stato non valido. Funziona semplicemente in un ciclo infinito, quindi è un bug.

Poiché si tratta di una soluzione alternativa, non vedo problemi con l'utilizzo di Thread.stop() se è necessario impedire l'applicazione. Il disclaimer sul perché non dovrebbe essere usato è più destinato a prevenire applicazioni multi-threaded mal sviluppate in quanto può essere assolutamente abusato.

+1

Grazie per la tua risposta, ho aspettato per oltre un mese per vedere se qualcuno poteva venire con un'idea migliore, ma sfortunatamente no ... La mia attuale soluzione è usare i comandi di sistema (ps e kill) per terminare OOo in questo situazione perché si blocca totalmente. Sembra un enorme casino lì :(Comunque, segnerò la tua risposta come corretta, grazie ancora. –

Problemi correlati