2013-01-23 57 views
5

我想創建一個具有內部優先級的優先級隊列,以便使用ServiceStack首先彈出較高優先級的messags。 ServiceStack RedisMQ實現提供了一個優先類型設置其IMessage接口。我期望在優先級屬性上以較高值發送的消息將首先從隊列中彈出。我的測試表明,有Priority> 0的消息被置於Redis「Mq:MyDto.priorityq」上,而任何其他值將消息置於隊列「Mq:MyDto.inq」中的正常值。RedisMQ中的Servicestack內部優先級PriorityQueue

這是一些示例代碼說明什麼,我試圖完成:

  using (var producer = MsgFactory.CreateMessageProducer()) 
     { 
      var lowPrioMsg = new Message<MyDto>(lowPrioDto); 
      lowPrioMsg = (long)1; 
      producer.Publish<MyDto>(lowPrioMsg); 

      var highPrioMsg = new Message<MyDto>(highPrioDto); 
      highPrioMsg.Priority = (long)100; 
      producer.Publish<MyDto>(highPrioMsg); 
     } 

換句話說,我希望highPrioMsg優先級= 100lowPrioMsg與之前被彈出優先權= 1。然而,在實踐中,這些信息似乎遵循先進先出原則。

有沒有一種方法可以配置ServiceStack的RedisMQ工作,因爲我期望與PriorityQueue內部優先級?

或者是我使用普通隊列還是優先隊列的唯一選擇?在這種情況下,爲什麼long用於優先級 setter而不是布爾值?

回答

2

ServiceStack Redis MQIMessageService實現你在正確的PriorityQ只是另一個FIFO隊列,所有當你發送一條消息,一個Priority > 0發生的,它被髮布到PriorityQ而不是標準的INQ消息通常發佈到。

優先級是一個數字,因此其他ServiceStack MQ提供程序有能力提供不同的實現,即使用優先級分數的實現。目前Redis中的PriorityQ由一個標準的redis服務器列表支持,該列表不支持優先化元素,最終我們可能會考慮將實現更改爲使用允許排序的排序集。

我們還打算爲ServiceStack(例如RabbitMQ,ZeroMQ,ServiceBus等)提供不同的MQ主機提供商,我們將在其中使用基本MQ代理支持它的優先級分數。

+0

好的,很好的答案。謝謝! –