因爲種種緣由,RabbitMQ到目前爲止,官方尚未實現優先級隊列,只實現了Consumer的優先級處理。html
可是,迫於種種緣由,應用層面上又須要優先級隊列,所以需求來了:如何爲RabbitMQ加入優先級隊列特性。windows
查詢資料後,得知RabbitMQ雖然官方沒有支持此特性,可是社區已經有相關優先級隊列插件了,而且這個插件被列在RabbitMQ官方網站中了。centos
地址以下:http://www.rabbitmq.com/community-plugins.htmlide
不要馬上下載這個url中的那個連接,要先根據你想要更新目標的rabbitmq版本再去另一個地方下載相應插件,如:網站
會列出兩大版本的插件目錄(選擇對應目錄進入下載,不然會報錯...):url
插件如何安裝?spa
進入rabbitmq安裝目錄,進入plugins目錄,將上面這個ez文件拷貝到plugins目錄中,而後運行命令來enable這個插件插件
centos下,默認路徑在:/usr/lib/rabbitmq/lib/rabbitmq_server-3.3.4/plugins(版本號可能會變化)code
windows下,默認路徑在:C:\Program Files\RabbitMQ Server\rabbitmq_server-3.3.4\plugins(版本號可能會變化)orm
把ez文件拷貝過去,而後運行列舉插件列表命令:
找到這個優先級隊列插件名爲:rabbitmq_priority_queue
執行:rabbitmq-plugins enable rabbitmq_priority_queue
ok,從新啓動rabbitmq-server服務。
這樣,server端的配置算完成了。
下面看看客戶端類庫的編寫:
咱們先要定義優先級枚舉,繼承自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