2012-01-12 31 views
7

Tôi sử dụng API OpenOffice từ Chương trình Java để xử lý Tài liệu cho tôi. Đôi khi (một lần mỗi 100k cuộc gọi) phương thức vứt bỏ của Tài liệu không trở lại, tải CPU vẫn ở mức 100% nhưng dường như không có gì xảy ra.Java: Phương thức không trả lại. (XComponent.dispose

Làm thế nào tôi nên hành động/code một cách chính xác trong tình huống này?

cách tiếp cận hiện tại của tôi là để chờ cho dispose để thành công trong hai giây. Nếu nó không tôi cố gắng chấm dứt OpenOffice thông qua API thích hợp Nếu điều đó cũng không thành công (như tôi mong đợi) thì tôi sẽ giết quá trình soffice với một cuộc gọi tới

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

và sau đó gọi

disposeThread.stop(); 

đến chủ đề mà ban đầu cố gắng vứt bỏ những XComponent. Bây giờ các API Java nói rằng Thread.stop() không nên được sử dụng (và có đối số hợp lệ cho điều đó) vì vậy tôi tự hỏi nếu có bất kỳ giải pháp tốt hơn mà những gì tôi đã làm.

+0

Đây là một trong những câu hỏi tùy thuộc vào cách nó được diễn đạt, nó có thể thích hợp cho lập trình viên, nhưng tôi cảm thấy như thế này là kỹ thuật và thực hiện cụ thể đủ để có thể có trên StackOverflow. –

+0

@maple_shaft Tôi nghĩ về điều đó nhưng quyết định chống lại nó. Nếu đó là câu hỏi về cách xử lý vấn đề cụ thể của tôi, tôi đã đặt nó ở đó, nhưng tôi đã tìm ra giải pháp làm việc cho vấn đề của mình và bây giờ tôi hỏi liệu có một khái niệm tốt hơn, chứ không phải là một giải pháp cụ thể. Nhưng vâng, nó tùy thuộc vào cách diễn đạt của nó. –

+0

@RobZ Đây thực sự không phải là một câu hỏi cụ thể của Open Office. My Open Office Situation ở đây chỉ là một ví dụ. –

Trả lời

4

Dường như bạn có một số cách khá mới lạ để làm việc xung quanh một lỗi hiếm kỳ lạ.

Cách tôi thấy là trong khi API Java tuyên bố rằng Thread.stop() không nên được sử dụng, có thể nói rằng OpenOffice Document.dispose() phải luôn trả về. Ngay cả khi nó là một sự xuất hiện hiếm, nó vẫn là một lỗi, vì nó không kết thúc và trả về một giá trị cũng không ném một ngoại lệ vì một trạng thái không hợp lệ. Nó chỉ chạy trong một vòng lặp vô hạn, do đó nó là một lỗi.

Vì đây là giải pháp thay thế, tôi không gặp vấn đề gì với việc sử dụng Thread.stop() nếu bạn cần ngăn ứng dụng của bạn bị treo. Tuyên bố từ chối trách nhiệm về lý do tại sao nó không được sử dụng nhằm ngăn chặn các ứng dụng đa luồng kém phát triển vì nó hoàn toàn có thể bị lạm dụng.

+1

Cảm ơn bạn đã trả lời, tôi đã đợi hơn một tháng để xem có ai có thể nghĩ ra một ý tưởng hay hơn, nhưng không may là ... Giải pháp hiện tại của tôi là sử dụng lệnh hệ thống (ps và kill) để chấm dứt OOo tình hình vì nó treo hoàn toàn. Nó có vẻ như một mớ hỗn độn lớn trong đó: (Dù sao, tôi sẽ đánh dấu câu trả lời của bạn là chính xác, cảm ơn một lần nữa. –