2012-01-19 30 views
6

Tôi đang sử dụng khung POJO hướng thư của Spring (và DefaultMessageListenerContainer nói riêng) để nghe một số hàng đợi và chủ đề.Làm cách nào để kiểm soát tốc độ mà Spring nhận được từ hàng đợi?

Trong trường hợp một hàng đợi đặc biệt, cần phải làm chậm tốc độ mà tại đó tôi rút hàng đợi, theo thứ tự của một tin nhắn sau mỗi năm phút. Việc xử lý thực sự của các tin nhắn là một hoạt động phụ thứ hai, nhưng tôi muốn người nghe ngồi nhàn rỗi trong một khoảng thời gian giữa các tin nhắn.

Tôi đã tạo một chút hack, nhưng nó được quyết định là tối ưu phụ: Điều tôi đã làm là đặt đồng thời tối đa thành 1 và thêm Thread.sleep(..) sau khi xử lý từng thư. Thay vào đó, tôi muốn tìm cách sử dụng DefaultMessageListenerContainer để chờ giữa các lần nhận, thay vì khiến trình xử lý thực hiện việc chờ trong quá trình xử lý tin nhắn.

Tôi đã xem xét nếu có một ScheduledExecutor có thể hữu ích, nhưng tôi nhận ra rằng việc điều chỉnh sẽ cần phải được thực hiện khi tác vụ được tạo ra. Có lẽ một số phương pháp từ DefaultMessageListenerContainer mà tôi có thể ghi đè để thực hiện những gì tôi sau?

Trả lời

0

Tôi không chắc chắn 100% nhưng tin rằng receiveTimeout là những gì bạn muốn.

<bean id="blahContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer"> 
    .... 
    <!-- 300000 = 5 * 60 * 1000 == 5 min --> 
    <property name="receiveTimeout" value="300000"/> 
</bean> 

receiveTimeout chấp nhận thời gian chờ trong mili giây, bạn có thể đọc thêm về nó trong javadocs

+1

Trừ khi tôi nhầm, tôi nghĩ bạn đang đề cập đến 'receiveTimout'. Thuộc tính này cố gắng nhận từ một hàng đợi trong một thời gian xác định trước khi phá hủy 'MessageConsumer'. – Ray

+0

oh, vâng, bạn nói đúng, tôi đã về receiveTimeout ( – ruslan

+3

Bạn nên chỉnh sửa câu trả lời nếu nó không chính xác. – Gray

3

Một thay thế cho thay đổi hành vi của người tiêu dùng của bạn sẽ là tận dụng Apache Camel để trì hoãn việc tin nhắn trong đó một cụ thể xếp hàng.

http://camel.apache.org/delayer.html mô tả chức năng của mẫu Camel Delayer. Ví dụ:

<route> 
    <from uri="jms:YOURQUEUE"/> 
    <delay> 
     <constant>1000</constant> 
    </delay> 
    <to uri="jms:DELAYEDQUEUE"/> 
</route> 

Sau đó, bạn sẽ sử dụng DELAYEDQUEUE và tất cả các tin nhắn sẽ bị trì hoãn 1 giây.

4

Tùy thuộc vào nhà cung cấp hàng đợi, bạn có thể đặt mức giá tối đa cho người tiêu dùng sử dụng hàng đợi của nó.

Ví dụ: trong hornetQ bạn đặt cài đặt này trong nhà máy kết nối bằng cách sử dụng tỷ lệ tối đa của người tiêu dùng.

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