吃多了拉就是隊列,吃飽了吐就是棧html
Setx ERLANG_HOME 「D:\Program Files\erl8.2″
rabbitmqctl status
肯定rabbitmq狀態Queue:消息隊列載體,每一個消息都會被投入到一個或多個隊列。c#
vhost:虛擬主機,一個broker裏能夠開設多個vhost,用做不一樣用戶的權限分離。windows
consumer:消息消費者,就是接收消息的程序。服務器
rabbitmq-plugins enable rabbitmq_management
// 啓用rabbitmq-plugins disable rabbitmq_management
// 禁用rabbitmqctl list_queues
// 查看隊列rabbitmqctl list_users
// 查看全部用戶rabbitmqctl add_user user_admin passwd_admin
// 添加用戶rabbitmqctl set_user_tags user_admin administrator
// 添加權限rabbitmqctl delete_user guest
// 刪除用戶rabbitmqctl change_password {username} {newpassowrd}
// 修改密碼rabbitmqctl add_vhost vhostpath
// 建立虛擬主機rabbitmqctl delete_vhost vhostpath
// 刪除虛擬主機rabbitmqctl list_vhosts
// 列出全部虛擬主機var factory = new ConnectionFactory { HostName = hostName, // rabbit server UserName = "admin", Password = "admin", Port = 5672, // Broker端口 VirtualHost = "/" // 虛擬Host,需提早配置 }; using (var connection = factory.CreateConnection()) // 建立與RabbitMQ服務器的鏈接 { using (var channel = connection.CreateModel()) // 建立1個Channel(大部分API在該Channel中) { // 定義1個隊列,自動會和默認的exchange 作direct類型綁定 channel.QueueDeclare( queue: "hello", // 隊列名稱 durable: true, // 隊列是否持久化 exclusive: false, // 排他隊列:若是一個隊列被聲明爲排他隊列,該隊列僅對首次聲明它的鏈接可見,並在鏈接斷開時自動刪除。(活動在一次鏈接內) autoDelete: false, // 自動刪除:當最後一個消費者取消訂閱時,隊列自動刪除。若是您須要僅由一個使用者使用的臨時隊列,請將自動刪除與排除。當消費者斷開鏈接時,隊列將被刪除。(至少消費者能連一次) arguments: null); // 配置參數 var randomQueue = channel.QueueDeclare(); // 定義隨機的隊列 該隊列爲臨時隊列(排他隊列 + 自動刪除) // 定義Exchange(通常而言,不須要定義exchange,rabbitmq默認建立了全部類型的exchange) //channel.ExchangeDeclare("direct-demo", ExchangeType.Direct); // 定義direct exchange //channel.ExchangeDeclare("fannout-demo", ExchangeType.Fanout); // 定義fanout exchange //channel.ExchangeDeclare("topic-demo", ExchangeType.Topic); // 定義fanout exchange // 定義queue exchange key 關係(在某些業務場景下,會使用該關係作路由功能) //channel.QueueBind(queue: "hello", exchange: "amq.direct", routingKey: "hello"); // 默認綁定的關係和該行代碼效果同樣 //channel.QueueBind("hello", "amq.fanout", "hello"); // 該類型下的routingKey 實際不須要 var properties = channel.CreateBasicProperties(); properties.Persistent = true; while (true) { string message = "Hello World!" + DateTime.Now; var body = Encoding.UTF8.GetBytes(message); // 發送消息到隊列中 channel.BasicPublish( exchange: string.Empty, // 傳遞爲Empty的時候,經過 `(AMQP default)`傳遞 routingKey: "hello", // routing key 與 queuebind中的binding key對應 basicProperties: properties, // 消息header body: body); // 消息body:發送的是bytes 能夠任意編碼 Console.WriteLine(" [x] Sent {0}", message); } } }
var factory = new ConnectionFactory { HostName = hostName, // rabbit server UserName = "admin", Password = "admin", Port = 5672, // Broker端口 VirtualHost = "/" // 虛擬Host,需提早配置 }; using (var connection = factory.CreateConnection()) { using (var channel = connection.CreateModel()) { var consumer = new EventingBasicConsumer(channel); // 建立Consumer consumer.Received += (model, ea) => // 經過回調函數異步推送咱們的消息 { var body = ea.Body; var message = Encoding.UTF8.GetString(body); Thread.Sleep(1000); channel.BasicAck(deliveryTag: ea.DeliveryTag, multiple: false); // 消息響應 Console.WriteLine(" [x] Received {0}", message); }; channel.BasicQos(0, 1, false); // 設置perfetchCount=1 。這樣就告訴RabbitMQ 不要在同一時間給一個工做者發送多於1個的消息 channel.BasicConsume(queue: "hello", noAck: false, // 須要消息響應(Acknowledgments)機制 consumer: consumer); Console.WriteLine(" Press [enter] to exit."); Console.ReadLine(); } }