Tôi có một ứng dụng dòng lệnh có sử dụng một Spring bean được quản lý bởi đó là bao gồm một java ExecutorService
tạo ra với:Làm cách nào để tắt dịch vụ thực thi đúng cách với Spring?
ExecutorService service = Executors.newFixedThreadPool(4);
Bây giờ, tôi muốn dịch vụ của tôi để tắt máy khi ứng dụng của tôi tắt, vì vậy tôi đã đậu của tôi thực hiện các giao diện DisposableBean
và có một phương pháp phá hủy như:
public void destroy(){
service.shutdown();
}
Sau đó, tôi có thể bị cám dỗ để làm một cái gì đó giống như đăng ký một cái móc shutdown vào bối cảnh mùa xuân. Tuy nhiên tôi phát hiện ra (một cách khó khăn, tức là, trong bản phát hành trước khi sản xuất) rằng điều này không hoạt động: hook tắt máy không được gọi trước khi phương thức ExecutorService.shutdown()
được gọi, gây ra vấn đề bắt cổ điển 22 (nó nhận được được gọi là gián đoạn, tức là, nếu tôi nhấn Ctrl-C trong khi ứng dụng đang chạy). Điều này thoát khỏi các bài kiểm tra đơn vị của tôi bởi vì vì lý do nào đó nó có vẻ hoạt động tốt từ bên trong JUnit, điều này vẫn khiến tôi khó hiểu: JUnit làm gì khác?
Giải pháp mà tôi đã tìm thấy cho đến nay là gọi rõ ràng ApplicationContext.close()
ngay trước khi tôi thoát khỏi chức năng chính của mình. Tôi đã tự hỏi nếu có một giải pháp tốt hơn cho điều này và thực hành tốt nhất để có hồ bơi thread linh hoạt được quản lý bởi mùa xuân là gì. Ngoài ra, nếu đậu của tôi là không phải do Spring quản lý trực tiếp nhưng được tạo ra bởi một bean do Spring quản lý? Tôi có nên xếp các cuộc gọi đến destroy()
không? Điều này có dễ bị lỗi không?
Tôi đánh giá cao mọi nhận xét, đề xuất, đọc thêm, RTFM, công thức nấu ăn kỳ diệu.
Cảm ơn!
PS: điều gì sẽ xảy ra nếu tôi muốn chuyển ứng dụng dòng lệnh của mình sang máy chủ ứng dụng như Tomcat? Có gì thay đổi không? –
Bao gồm tiêu đề và số PS của bạn, tôi * 7 * (7!) Dấu chấm hỏi. :-) Có thể nhận được phản hồi tốt hơn nếu bạn chỉ hỏi một câu hỏi cụ thể. – Keith