2012-01-12 12 views
7

Używam API OpenOffice z mojego programu Java do obsługi Dokumentów dla mnie Czasami (raz na każde 100 000 wywołań) metoda utylizacji dokumentu nie powraca, obciążenie procesora pozostaje na poziomie 100%, ale nic nie wydaje się wydarzy.Java: Metoda nie powraca. (XComponent.dispose

Jak należy postępować/kod poprawnie w tej sytuacji?

Moje obecne podejście jest czekać na zrzucać do osiągnięcia sukcesu przez dwie sekundy. Jeśli nie próbuję rozwiązać OpenOffice poprzez odpowiednie API Jeśli to również się nie powiedzie (tak jak się spodziewam), zabiję proces soffice, dzwoniąc pod numer

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

a następnie zadzwonić

disposeThread.stop(); 

do wątku, który początkowo próbuje pozbyć się XComponent. Teraz Java API mówi, że nie powinno się używać Thread.stop() (i istnieją do tego odpowiednie argumenty), więc zastanawiam się, czy istnieją lepsze rozwiązania, które zrobiłem.

+0

Jest to jedno z tych pytań, w zależności od tego, w jaki sposób jest sformułowane, może być odpowiednie dla programistów, ale mam wrażenie, że jest to technika i implementacja wystarczająco specyficzna, że ​​prawdopodobnie powinna być na StackOverflow. –

+0

@maple_shaft Zastanowiłem się nad tym, ale zdecydowałem przeciwko niemu. Gdyby chodziło o to, jak poradzić sobie z moim konkretnym problemem, umieściłbym go tam, ale znalazłem już działające rozwiązanie mojego problemu, a teraz pytam, czy istnieje lepsze pojęcie, a nie konkretne rozwiązanie. Ale tak, to zależy od tego, jak jest sformułowane. –

+0

@RobZ To naprawdę nie jest pytanie specyficzne dla pakietu Office. Moja sytuacja w otwartym biurze jest tutaj tylko przykładem. –

Odpowiedz

4

Wygląda na to, że masz całkiem nowe sposoby na obejście dziwnego, rzadkiego błędu.

Sposób, w jaki widzę, to to, że podczas gdy API Java stwierdza, że ​​nie należy używać Thread.stop(), to samo można powiedzieć, że OpenOffice Document.dispose() powinien zawsze powracać. Nawet jeśli jest to rzadkie zdarzenie, nadal jest błędem, ponieważ nie kończy i zwraca wartości ani nie rzuca wyjątku z powodu nieprawidłowego stanu. Po prostu działa w nieskończonej pętli, więc jest to błąd.

Ponieważ jest to obejście problemu, nie widzę problemów z używaniem Thread.stop(), jeśli chcesz zapobiec zawieszeniu aplikacji. Zastrzeżenie dotyczące tego, dlaczego nie powinno być używane, ma na celu w szczególności zapobieganie źle opracowanym aplikacjom wielowątkowym, ponieważ może być całkowicie nadużywane.

+1

Dziękuję za twoją odpowiedź, czekałem ponad miesiąc teraz, aby sprawdzić, czy ktokolwiek mógłby wymyślić lepszy pomysł, ale niestety nie ... Moje obecne rozwiązanie polega na użyciu poleceń systemowych (ps i kill), aby zakończyć OOo w tym sytuacja, ponieważ wisi całkowicie. Wygląda na to, że jest tam wielki bałagan :(Tak czy inaczej, zaznaczę twoją odpowiedź jako poprawną, jeszcze raz dziękuję. –