前言
最近項目要使用RabbitMQ,園里里面已經有很多優秀的文章,Rabbitmq官網也有.net實例。這里我嘗試下圖文並茂之形式記錄下使用的過程。
安裝
RabbitMQ是建立在erlang OTP平台下,因此在windows下需要下載並安裝以下兩個組件:
2. Rabbit MQ Windows Service Install
RabbitMQ安裝完成之后一般需要設置一個賬號,通過命令 add_user , set_permissions 設置權限,set_user_tags 設置群組。
還需要安裝其基於http的管理平台插件,這個平台插件便於我們查看和管理RabbitMQ,可以通過命令行將其啟用。
rabbitmq-plugins enable rabbitmq_management rabbitmqctl add_user july July! rabbitmqctl set_permissions july ".*" ".*" ".*" rabbitmqctl set_user_tags july administrator
之后就可以通過 http://localhost:15672/ 登錄,賬號的密碼和密碼可以使用默認的guest/guest,登錄之后的頁面:

RabbitMq 使用
下圖就是具體的使用流程

其方框中就是Rabbitmq的message broker,我們將上圖按上下方式來解釋:

1. 信息發送端將消息(message)發送到exchange
2. exchange接受消息之后,負責將其路由到具體的隊列中
3. Bindings負責連接exchange和隊列(queue)
4. 消息到達隊列(queue),然后等待被消息接收端處理
5. 消息接收端處理消息
初始化RabbitMQ
現在我們用代碼來demo流程,首先在nuget上獲取RabbitMQ.Client:

然后創建圖中2,3,4步需要的exchange,bingding,queue
string exchangeName = "test.exchange"; string queueName = "test1.queue"; string otherQueueName = "test2.queue"; using (IConnection conn = rabbitMqFactory.CreateConnection()) using (IModel channel = conn.CreateModel()) { //2 定義一個exchange channel.ExchangeDeclare(exchangeName, "direct", durable: true, autoDelete: false, arguments: null); //4 定義兩個queue channel.QueueDeclare(queueName, durable: true, exclusive: false, autoDelete: false, arguments: null); channel.QueueDeclare(otherQueueName, durable: true, exclusive: false, autoDelete: false, arguments: null); //3 定義exchange到queue的binding channel.QueueBind(queueName, exchangeName, routingKey: queueName); channel.QueueBind(otherQueueName, exchangeName, routingKey: otherQueueName); }
創建成功之后可以在rabbit的管理平台查看:


發送消息
從圖上我們得知消息是發送到rabbitmq的exchange,但可以傳一些消息屬性如routingkey,一下代碼中我們將隊列的名字作為routingkey傳進去:
string exchangeName = "test.exchange"; string queueName = "test1.queue"; string otherQueueName = "test2.queue"; using (IConnection conn = rabbitMqFactory.CreateConnection()) using (IModel channel = conn.CreateModel()) { var props = channel.CreateBasicProperties(); props.Persistent = true; var msgBody = Encoding.UTF8.GetBytes("Hello, World!"); //1. 發送消息到exchange ,但加上routingkey channel.BasicPublish(exchangeName, routingKey: queueName, basicProperties: props, body: msgBody); channel.BasicPublish(exchangeName, routingKey: otherQueueName, basicProperties: props, body: msgBody); }
發送之后可以在rabbitmq上看到:


接收消息
string queueName = "test1.queue"; string otherQueueName = "test2.queue"; using (IConnection conn = rabbitMqFactory.CreateConnection()) using (IModel channel = conn.CreateModel()) { //5. 從test1.queue 隊列獲取消息 BasicGetResult msgResponse = channel.BasicGet(queueName, noAck: true); string msgBody = Encoding.UTF8.GetString(msgResponse.Body); //5. 從test2.queue 隊列獲取消息 msgResponse = channel.BasicGet(otherQueueName, noAck: true); msgBody = Encoding.UTF8.GetString(msgResponse.Body); }
總結
通過以上的簡述我們對rabbitmq的使用就有了大概的了解。
