2010-09-17 37 views

Trả lời

5

Có, nó sẽ làm việc. Trên một ứng dụng web tôi đã làm việc, tôi cần gửi một email thông báo tùy thuộc vào hành động của người dùng. Tôi đã thêm một kẻ đánh chặn hậu cam kết trên dịch vụ và đã tắt email đó trong một chuỗi riêng biệt. (Trong trường hợp của tôi đã xảy ra để được sạch hơn so với đặt mã trong bộ điều khiển, bởi vì tôi chỉ muốn nó xảy ra nếu giao dịch cam kết.)

Bạn cần phải chắc chắn rằng thread thực sự ngừng chạy tại một số điểm, hoặc là bằng cách đặt daemon thành true (nếu ok thì dừng máy chủ sẽ hủy chuỗi mà không cần thông báo) hoặc đảm bảo mã trong phương thức chạy của nó sẽ luôn chấm dứt tại một số điểm.

Bạn nên sử dụng một threadpool hơn là tạo chủ đề mới, vì vậy bạn không gặp rủi ro cạn kiệt tài nguyên (chủ đề ngừng hoạt động thường không phải là sự kiện độc lập, nếu chuỗi treo tiếp theo có thể sẽ quá, vì vậy bạn cần một cách để cắt lỗ của bạn). Các phương thức được chú thích bằng @Async sẽ được thực hiện bằng cách sử dụng trình thực thi mà bạn có thể định cấu hình như được hiển thị trong the Spring documentation.

+0

Có lẽ điều đáng nói là Bộ điều khiển không thể thông báo cho người dùng khi gửi email không thành công (trừ khi bạn sử dụng Callable.get() loại mục đích nào của chuỗi khác ở đây). – extraneon

+0

Nếu tôi muốn sử dụng một hồ bơi thread, làm thế nào tôi có thể đạt được rằng chỉ có một threadpool được sử dụng cho tất cả người dùng/yêu cầu trên máy chủ? Chỉnh sửa: Điều này có thể được thực hiện bằng cách phạm vi đậu threadpool để "singleton"? – Erik

4

Có, bạn có thể bắt đầu chuỗi mới trong bộ điều khiển. Nhưng cách tốt hơn để làm công việc không đồng bộ là sử dụng hỗ trợ lập lịch trình mùa xuân. Bạn có thể tận dụng khung Quartz. Điều đó sẽ quản lý công việc của bạn.

Điều này link sẽ cung cấp cho bạn cách tích hợp điều này trong ứng dụng của bạn.

+1

Bạn có thể đi một chút vào lý do tại sao sử dụng spring-scheduling/Quartz tốt hơn là bắt đầu một Thread mới trong trường hợp này? – Valera

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