由于種種原因,RabbitMQ到目前為止,官方還沒有實(shí)現(xiàn)優(yōu)先級(jí)隊(duì)列,只實(shí)現(xiàn)了Consumer的優(yōu)先級(jí)處理。
但是,迫于種種原因,應(yīng)用層面上又需要優(yōu)先級(jí)隊(duì)列,因此需求來了:如何為RabbitMQ加入優(yōu)先級(jí)隊(duì)列特性。
查詢資料后,得知RabbitMQ雖然官方?jīng)]有支持此特性,但是社區(qū)已經(jīng)有相關(guān)優(yōu)先級(jí)隊(duì)列插件了,并且這個(gè)插件被列在RabbitMQ官方網(wǎng)站中了。
地址如下:http://www.rabbitmq.com/community-plugins.html

不要立刻下載這個(gè)url中的那個(gè)鏈接,要先根據(jù)你想要更新目標(biāo)的rabbitmq版本再去另外一個(gè)地方下載相應(yīng)插件,如:

會(huì)列出兩大版本的插件目錄(選擇對(duì)應(yīng)目錄進(jìn)入下載,否則會(huì)報(bào)錯(cuò)...):


插件如何安裝?
進(jìn)入rabbitmq安裝目錄,進(jìn)入plugins目錄,將上面這個(gè)ez文件拷貝到plugins目錄中,然后運(yùn)行命令來enable這個(gè)插件
centos下,默認(rèn)路徑在:/usr/lib/rabbitmq/lib/rabbitmq_server-3.3.4/plugins(版本號(hào)可能會(huì)變化)
windows下,默認(rèn)路徑在:C:/PRogram Files/RabbitMQ Server/rabbitmq_server-3.3.4/plugins(版本號(hào)可能會(huì)變化)
把ez文件拷貝過去,然后運(yùn)行列舉插件列表命令:

找到這個(gè)優(yōu)先級(jí)隊(duì)列插件名為:rabbitmq_priority_queue
執(zhí)行:rabbitmq-plugins enable rabbitmq_priority_queue
ok,重新啟動(dòng)rabbitmq-server服務(wù)。
這樣,server端的配置算完成了。
下面看看客戶端類庫(kù)的編寫:
我們先要定義優(yōu)先級(jí)枚舉,繼承自byte,因?yàn)镽abbitMQ的C#客戶端優(yōu)先級(jí)是用byte來傳遞的:
先定義3個(gè)級(jí)別的優(yōu)先級(jí):低、中、高(其實(shí)可以定義很多級(jí)別,只是為了簡(jiǎn)化,因此只定義了3個(gè)級(jí)別)

有2個(gè)地方需要改動(dòng):
internal static IDictionary<string, object> QueueArguments { get { IDictionary<string, object> arguments=new Dictionary<string, object>(); arguments["x-max-priority"] = 10;//定義隊(duì)列優(yōu)先級(jí)為10個(gè)級(jí)別 return arguments; } }channel.QueueDeclare("queueName", true, false, false, QueueArguments);//QueueArguments就是上面定義的這個(gè)dictionaryvar headers = channel.CreateBasicProperties();headers.Priority = (byte)msg.Priority;//在這里把繼承自byte的枚舉轉(zhuǎn)換成bytechannel.BasicPublish("exchange", "route", headers, SerializerUtility.Serialize2Bytes(msg));在裝了優(yōu)先級(jí)隊(duì)列插件的rabbitmq-server實(shí)例中,所有的Durable隊(duì)列必須用如上的方式,設(shè)置x-max-priority屬性,否則rabbitmq-server服務(wù)會(huì)crash
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注