创建一个工作队列
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(); }