2012-04-20 21 views
7

Tôi có một nhiệm vụ theo lịch trình như vậy:Kích thước nhóm thực sự hoạt động như thế nào với các tác vụ theo lịch của Spring?

<task:scheduler id="notification.scheduler" pool-size="15" /> 

<task:scheduled-tasks scheduler="notification.scheduler"> 
    <task:scheduled ref="notificationProcessor" method="sendNextQueueEvent" fixed-rate="500" /> 
    <task:scheduled ref="notificationProcessor" method="deleteNextCompletedEvent" fixed-rate="60000" /> 
</task:scheduled-tasks> 

Tôi nghĩ rằng tôi có một sự hiểu lầm về cách sắp xếp công việc làm việc với kích thước hồ bơi. Mặc dù kích thước hồ bơi là 15, có vẻ như chỉ có một sợi đang được sử dụng. Ví dụ, nếu tôi có mười lăm sự kiện trong hàng đợi, tôi sẽ nghĩ rằng sẽ có mười lăm chủ đề kiểm tra từng phút để xóa một sự kiện khỏi hàng đợi. Rõ ràng, điều này là sai.

Tôi làm cách nào để có 15 đề tài gọi phương thức này trong khoảng thời gian bằng cách sử dụng tính trừu tượng của lịch trình của Spring?

Chỉnh sửa: Những gì tôi muốn thực hiện là: Mỗi nửa giây, tôi muốn kiểm tra xem có sự kiện xếp hàng nào được gửi hay không. Khi điều này được thực hiện, tôi muốn gửi tối đa 15 (nếu 15 tồn tại). Làm thế nào tôi sẽ thực hiện điều này bằng cách sử dụng trừu tượng mùa xuân cho các công cụ thread java?

Trả lời

3

Spring task:scheduler là theo mặc định một thuộc tính bean bao bọc cho java.util.concurrent.ThreadPoolExecutor:

corePoolSize - số chủ đề để giữ trong hồ bơi, ngay cả khi họ là nhàn rỗi.

này không đảm bảo rằng các pools-size tài sản tương đương với việc có con số của hoạt động đề. Mặt khác, bạn nên lưu ý rằng tại bất kỳ điểm đã cho nào trong thời gian chỉ có thể có một số lượng tối đa các luồng bằng các lõi xử lý trên máy mà bạn đang sử dụng; tức là tất cả các chủ đề khác sẽ đợi để chuyển sang chế độ RUNNING và tiếp tục thực hiện.

Ngoài ra, trong tài liệu của Spring, nó đề cập rằng nếu đây không phải là những gì bạn cần, bạn cũng có thể tận dụng lợi thế của ConcurrentTaskExecutor.

+0

Nếu tôi có bốn lõi, không nên có ít nhất bốn luồng? Tôi chỉ thấy một. Nếu tôi có hàng trăm sự kiện trong hàng đợi của mình, khi trình lập lịch biểu này bắt đầu, tôi có nên thấy ngay bốn lệnh gọi sendNextQueueEvent, một từ mỗi chuỗi không? – AHungerArtist

+0

Bốn là số lượng tối đa các chuỗi _concurrent active_ mà bạn có thể có; nó không phải là thiết lập mặc định ban đầu. Việc xem các cuộc gọi cũng phụ thuộc vào những thứ khác nhau như mô hình đồng thời của hàng đợi bạn sử dụng cho các sự kiện và tốc độ/thời gian mà tác vụ được thực thi. Tôi hi vọng cái này giúp được. – nobeh

4

Trước hết là <task:scheduler/> là trình bao bọc xung quanh ScheduledThreadPoolExecutor mở rộng ThreadPoolExecutor. Javadoc cho sau này nói:

đề thậm chí lõi ban đầu được tạo ra và bắt đầu chỉ khi nhiệm vụ mới đến

Thứ hai, bạn phải hiểu rằng nhiệm vụ theo lịch trình (đây là một tính năng Java, không Spring) không chạy đồng thời, ngay cả khi chúng mất nhiều thời gian hơn khoảng lặp lại. Họ chỉ đơn giản là chờ đợi. Vì vậy, bạn không có 15 sự kiện đang chờ trong hàng đợi, bạn có 15 lần thực thi trễ và đợi cho chuỗi đó. Không cần phải tạo một cái khác vì việc thực thi tiếp theo phải chờ cho đến khi kết thúc trước. Một lần nữa, đây là cách mà khung công tác lập kế hoạch Java hoạt động.

Tất nhiên nếu bạn có nhiều tác vụ khác nhau được lên lịch, nhiều chuỗi sẽ được tạo.

+0

Cảm ơn bạn. Tôi nghĩ rằng tôi chủ yếu hiểu được mối quan hệ giữa mọi thứ.Vì vậy, (và có lẽ không phải là giải pháp thanh lịch nhất), nếu tôi muốn 15 chủ đề khác nhau xử lý các sự kiện hàng đợi, tôi phải lặp lại ' '15 lần? – AHungerArtist

+0

Vì vậy, tôi đoán, giá trị của kích thước hồ bơi là gì? Có phải là nếu có năm nhiệm vụ nhưng kích thước hồ bơi là hai, các nhiệm vụ khác sẽ phải đợi cho đến khi hai nhiệm vụ đầu tiên được thực hiện? – AHungerArtist

+0

@AHungerArtist: không, thực sự một cách tiếp cận tốt hơn là có một hồ bơi được quản lý bằng Spring với 'pool-size =" 15 "' chỉ cần thêm một công việc mới vào một 'ExecutorService' bình thường với 15 luồng. Sau đó, nó sẽ xử lý các sự kiện bằng cách sử dụng tất cả các chủ đề càng nhanh càng tốt. Xin giải thích các yêu cầu của bạn tốt hơn, bạn muốn chạy một số mã mỗi 500ms trong 15 chủ đề đồng thời? Hãy thêm nó vào câu hỏi này hoặc mở một câu hỏi khác để chúng tôi có thể nghĩ ra một số giải pháp thanh lịch. Hãy nhớ đăng liên kết theo dõi nếu có. –

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