2012-01-13 38 views
6

Chúng tôi hiện đang phát triển một ứng dụng bằng JMS và activemq (5.5.1). Chúng tôi muốn xác định mức độ ưu tiên cao hơn cho một số thư, điều này sẽ khiến chúng bị tiêu thụ trước tiên. Sau khi thiết lập nhà sản xuất và người tiêu dùng (thông qua mùa xuân (3.1) JMSTemplate), ưu tiên không hoàn toàn hoạt động. Thật vậy, khi chúng tôi "tắt" người tiêu dùng và gửi một số tin nhắn, ưu tiên được tôn trọng, nhưng khi chúng tôi thêm tin nhắn trong khi người tiêu dùng đang bật, các tin nhắn được nhận theo cùng thứ tự mà họ đã gửi.Ưu tiên với activemq

Cấu hình khá đơn giản:

ưu tiên đã được kích hoạt trong file config ActiveMQ:

<policyEntries> 
    <policyEntry queue=">" prioritizedMessages="true"/> 
    ... 
</policyEntries> 

Và QoS được kích hoạt trong sản xuất mẫu cấu hình:

<bean id="jmsOCRTemplate" class="org.springframework.jms.core.JmsTemplate"> 
    <property name="connectionFactory" ref="connectionFactory" /> 
    <property name="defaultDestination" ref="destination_ocr" /> 
    <property name="explicitQosEnabled" value="true" /> 
</bean> 

Để gửi với mức độ ưu tiên cao, chúng tôi chỉ thay đổi thuộc tính ưu tiên của mẫu ở phía bên sản xuất:

template.setPriority(9); 

Bất kỳ ý tưởng nào? Đây có phải là hành vi bình thường hay có một số cấu hình mà chúng ta đã quên?

+0

Bạn có thể muốn cung cấp cho các ActiveMQ mới nhất 5.6-SNAPSHOT một đi như nó có một số bản sửa lỗi trong lĩnh vực ưu tiên có thể cải thiện tình trạng của bạn. –

Trả lời

7

Nếu ý kiến ​​của tôi là bạn không bỏ sót bất cứ điều gì, tôi đã có một vấn đề tương tự một vài tuần trước (nhưng với TTL và QPid).

Đầu tiên JMS là không chặt chẽ về vấn đề này:

JMS does not require that a provider strictly implement priority ordering of messages; however, it should do its best to deliver expedited messages ahead of normal messages. 

Thứ hai, ActiveMQ chưa thực hiện hàng đợi ưu tiên, họ nói nó sẽ ở đâu đó trong phiên bản 6.x.

Vì vậy, những gì bạn thấy thực sự bình thường.

Như một công việc xung quanh, bạn có thể sử dụng mẫu Resequencer nếu nó phù hợp với trường hợp của bạn.

http://camel.apache.org/resequencer.html

Dưới đây là một cuộc thảo luận về chủ đề này:

http://activemq.2283324.n4.nabble.com/Priority-message-td2352179.html

+0

Cảm ơn bạn Eugene, tôi sẽ xem xét Resequencer sau đó. – nicompte

0

Tôi biết nó là muộn nhưng câu trả lời này có thể giúp ai đó.

Nếu bạn muốn người tiêu dùng của bạn tiêu thụ thông điệp dựa trên mức độ ưu tiên (Hàng đợi ưu tiên) thì bạn có thể sử dụng ưu tiên thông điệp phía máy khách. Điều này có nghĩa là khi tin nhắn được gửi đến người tiêu dùng của bạn (ngay cả trước khi người tiêu dùng của bạn nhận được chúng, sử dụng tìm nạp trước), chúng sẽ được lưu vào bộ nhớ cache ở phía người tiêu dùng và được ưu tiên theo mặc định. Điều này bất kể bạn có đang sử dụng hỗ trợ ưu tiên ở phía nhà môi giới hay không. Điều này có thể ảnh hưởng đến thứ tự bạn thấy trên người tiêu dùng vì vậy hãy ghi nhớ điều này.

Để bật tính năng này, hãy đặt tùy chọn cấu hình sau trên URL nhà môi giới của bạn, ví dụ:,

tcp://0.0.0.0:61616?jms.messagePrioritySupported=true 

Để vô hiệu hóa nó, tcp://0.0.0.0:61616?jms.messagePrioritySupported=false

Vì vậy, bạn không cần phải sử dụng Camel (nếu bạn muốn tránh biến chứng)