Tôi đang sử dụng ScheduledExecutorService
để chạy các chuỗi đã lên lịch.
Tôi đã triển khai ServletContextListener.contextDestroyed
và gọi ScheduledExecutorService.shutdownNow
và awaitTermination
.Tomcat 7 và ScheduledExecutorService.shutdown
Dưới đây là một ví dụ:
@Override
public void contextDestroyed(ServletContextEvent servletcontextevent) {
pool.shutdownNow(); // Disable new tasks from being submitted
try {
// Wait a while for existing tasks to terminate
if (!pool.awaitTermination(50, TimeUnit.SECONDS)) {
pool.shutdownNow(); // Cancel currently executing tasks
System.err.println("Pool did not terminate");
}
} catch (InterruptedException ie) {
// (Re-)Cancel if current thread also interrupted
pool.shutdownNow();
// Preserve interrupt status
Thread.currentThread().interrupt();
}
}
Tuy nhiên, tôi nhận được lỗi sau từ Tomcat 7:
NGHIÊM TRỌNG: Các ứng dụng web [/ servlet] dường như đã bắt đầu một chuỗi có tên [Timer-0] nhưng đã không dừng được. Điều này rất có thể là để tạo rò rỉ bộ nhớ.
Nhật ký này có thể bỏ qua không? Hay tôi đang làm điều gì sai?
Cảm ơn
Ý tôi là, suy nghĩ của tôi là: Trách nhiệm của bạn trong việc dọn dẹp dừng lại ở đâu? Những gì khác có thể được thực hiện ở đây? Đánh hộp với một vòi cứu hỏa? Trong mọi sự nghiêm túc, điều tôi muốn nói là có vẻ như bạn đang làm tất cả những gì bạn có thể làm ... Tôi sẽ bỏ qua lỗi đó. – ControlAltDel
Bạn có thể tham khảo bài viết trước của tôi :) http://stackoverflow.com/questions/9926356/scheduledexecutorservice-when-shutdown-should-be-invoked – lili