我的RabbitMQ學習2(工作隊列)
阿新 • • 發佈:2017-12-27
font 初始化 body ack 學習 false message 常見 sin
創建一個工作隊列
1.建立一個生成者
//初始化一個連接 生產者 -> (消費者) var factory = new ConnectionFactory() { HostName = "localhost" }; using (var connection = factory.CreateConnection()) using (var channel = connection.CreateModel()) {//對應的隊列 channel.QueueDeclare(queue: "order_task", durable: true, exclusive: false, autoDelete: false, arguments: null);var consumer = new EventingBasicConsumer(channel); //接受消息 consumer.Received += (model, ea) => { var body = ea.Body; var message = Encoding.UTF8.GetString(body); Console.WriteLine("接受到信息: {0} mode:{1}", message, model); }; channel.BasicConsume("order", true, consumer); Console.ReadLine(); }
2.建立一個消費者 但是不自動消費它
//autoAck = false 表示不自動確實 也就代表會一直存在消息隊列中
//弊端:官方==》錯過BasicAck是一個常見的錯誤。這是一個容易的錯誤,但後果是嚴重的。當你的客戶退出時,消息會被重新傳遞(這可能看起來像是隨機的重新傳遞),但是RabbitMQ會占用越來越多的內存,因為它不能釋放任何未被消息的消息。
為了調試這種錯誤,你可以使用rabbitmqctl 打印messages_unacknowledged字段:
//初始化一個連接 生產者 -> (消費者) var factory = new ConnectionFactory() { HostName = "localhost" }; using (var connection = factory.CreateConnection()) using (var channel = connection.CreateModel()) { //對應的隊列 channel.QueueDeclare(queue: "order_task", durable: true, exclusive: false, autoDelete: false, arguments: null); var consumer = new EventingBasicConsumer(channel); //接受消息 consumer.Received += (model, ea) => { var body = ea.Body; var message = Encoding.UTF8.GetString(body); Console.WriteLine("接受到信息: {0} mode:{1}", message, model); }; //autoAck = false 表示不自動確實 也就代表會一直存在消息隊列中 //弊端:官方==》錯過BasicAck是一個常見的錯誤。這是一個容易的錯誤,但後果是嚴重的。當你的客戶退出時,消息會被重新傳遞(這可能看起來像是隨機的重新傳遞),但是RabbitMQ會占用越來越多的內存,因為它不能釋放任何未被消息的消息。 //為了調試這種錯誤,你可以使用rabbitmqctl 打印messages_unacknowledged字段: channel.BasicConsume("order", false, consumer); Console.ReadLine(); }
我的RabbitMQ學習2(工作隊列)