2012-10-10 20 views
22

Trong ứng dụng web của tôi, tôi đã tạo một dịch vụ đang sử dụng ExecutorService với kích thước cố định ThreadPool. Tôi tái sử dụng cùng một ExecutorService trong suốt toàn bộ thời gian áp dụng.Tắt máy ExecutorService một cách trang nhã trong ứng dụng web?

private static ExecutorService pool = Executors.newFixedThreadPool(8); 

Tất cả đang chạy trong Tomcat mà mang lại cho tôi những lỗi sau khi shuting xuống:

appears to have started a thread named [pool-1-thread-1] but has failed to stop it. This is very likely to create a memory leak. 

tôi nhận ra tôi cần phải tắt ExecutorService trước shuting tomcat xuống. Soms SO thread đã nói về điều này nhưng tôi không thể tìm thấy một cách sạch sẽ để xử lý này.

Tôi có nên sử dụng số ShutdownHook như đề xuất @ Tim-bender trong Graceful shutdown of threads and executor không? Hoặc tôi nên sử dụng một CachedThreadPool thay thế?

Trả lời

25

Shutdown móc không phải là một phương pháp tốt trong Tomcat vì:

  • nó sẽ đóng hồ bơi quá muộn (trên tắt máy), Tomcat sẽ đã cảnh báo bạn về các nguồn tài nguyên không đóng cửa

  • bạn thực sự muốn tắt hồ bơi khi ứng dụng không được triển khai để việc triển khai lại hoạt động (nếu không, mỗi ứng dụng sẽ tạo ra hồ bơi mới và tất cả chúng sẽ chỉ được đóng khi tắt hoàn toàn)

  • tắt luồng hồ bơi có thể mất một thời gian (xem bên dưới), móc tắt máy phải càng nhanh càng tốt

Nơi tốt hơn là ServletContextListener.contextDestroyed(). Hãy nhớ rằng bạn phải có cả hai shutdownNow() hồ bơi (để hủy chạy và từ chối các tác vụ mới) và awaitTermination() để đợi các tác vụ đang chạy để kết thúc và tất cả các chuỗi phải dừng.

+1

Chính xác những gì tôi cần biết –

7

Ngoài những gì Tomasz gợi ý bạn cũng có thể sử dụng CachedThreadPool

Chủ đề chưa được sử dụng cho sáu mươi giây được chấm dứt và loại bỏ khỏi bộ nhớ cache. Do đó, một hồ bơi mà vẫn nhàn rỗi trong thời gian dài đủ sẽ không tiêu thụ bất kỳ tài nguyên

Vì vậy, một giải pháp rất tốt sẽ sử dụng CachedThreadPool và tắt nó trong ServletContextListener.contextDestroyed().

+4

+1 congrats cho 5K –

+0

@NandkumarTekale Cảm ơn. Nó có vẻ tốt :) –

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