2012-03-29 29 views
5

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.shutdownNowawaitTermination.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

+0

Ý 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

+0

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

Trả lời

4

Bạn có chắc chắn lỗi này có liên quan đến nhóm Chủ đề của bạn không? Đánh giá theo tên luồng 'Timer-0' có lẽ nó đã được bắt đầu bởi một số loại hẹn giờ.

Ngoài ra, bạn tắtHow() sẽ trả lại cho bạn danh sách Tác vụ vẫn đang chờ kết thúc (xem JavaDoc). Bạn có thể xây dựng logic để chờ đợi nhiều hơn nếu danh sách không trống.

1

Bạn đang tắt chính xác ScheduledExecutorService của mình. Tuy nhiên, chủ đề được tạo bởi ExecutorService theo mặc định tuân theo quy ước đặt tên này: pool-X-thread-Y.

Timer-0 chủ đề được tạo bởi Timer lớp. Hãy tìm chúng trong mã và thư viện của bạn.

Các vấn đề liên quan