1. 程式人生 > >我的RabbitMQ學習2(工作隊列)

我的RabbitMQ學習2(工作隊列)

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(工作隊列)