當前位置:編程學習大全網 - 源碼下載 - 如何基於RabbitMQ實現優先級隊列

如何基於RabbitMQ實現優先級隊列

由於種種原因,RabbitMQ到目前為止,官方還沒有實現優先級隊列,只實現了Consumer的優先級處理。

但是,迫於種種原因,應用層面上又需要優先級隊列,因此需求來了:如何為RabbitMQ加入優先級隊列特性。

查詢資料後,得知RabbitMQ雖然官方沒有支持此特性,但是社區已經有相關優先級隊列插件了,並且這個插件被列在RabbitMQ官方網站中了。

插件如何安裝?

進入rabbitmq安裝目錄,進入plugins目錄,將上面這個ez文件拷貝到plugins目錄中,然後運行命令來enable這個插件

centos下,默認路徑在:/usr/lib/rabbitmq/lib/rabbitmq_server-3.3.4/plugins(版本號可能會變化)

windows下,默認路徑在:C:\Program Files\RabbitMQ Server\rabbitmq_server-3.3.4\plugins(版本號可能會變化)

把ez文件拷貝過去,然後運行列舉插件列表命令:

找到這個優先級隊列插件名為:rabbitmq_priority_queue

執行:rabbitmq-plugins enable rabbitmq_priority_queue

ok,重新啟動rabbitmq-server服務。

這樣,server端的配置算完成了。

C#代碼端需要作出的更改

下面看看客戶端類庫的編寫:

我們先要定義優先級枚舉,繼承自byte,因為RabbitMQ的C#客戶端優先級是用byte來傳遞的:

先定義3個級別的優先級:低、中、高(其實可以定義很多級別,只是為了簡化,因此只定義了3個級別)

有2個地方需要改動:

申明隊列時需要加入自定義的屬性

發送消息到rabbitmq時,設置自定義屬性

internal static IDictionary<string, object> QueueArguments { ?get ?{ IDictionary<string, object> arguments=new Dictionary<string, object>(); arguments["x-max-priority"] = 10;//定義隊列優先級為10個級別 return arguments; ?} }

channel.QueueDeclare("queueName", true, false, false, QueueArguments);//QueueArguments就是上面定義的這個dictionary

var headers = channel.CreateBasicProperties();headers.Priority = (byte)msg.Priority;//在這裏把繼承自byte的枚舉轉換成bytechannel.BasicPublish("exchange", "route", headers, SerializerUtility.Serialize2Bytes(msg));

其他註意的地方

在裝了優先級隊列插件的rabbitmq-server實例中,所有的Durable隊列必須用如上的方式,設置x-max-priority屬性,否則rabbitmq-server服務會crash

轉載

  • 上一篇:哪裏有flash時鐘下載
  • 下一篇:開發壹個微信小程序要多少錢?小程序是怎麽收費的?
  • copyright 2024編程學習大全網