由於種種原因,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
轉載