04.直连交换机
场景:
1.主办方发布一个活动
2.客户方预约
3.通过VX关联的客户发送邮件
代码:
public void Method4() { //创建连接 var connection = factory.CreateConnection(); //创建通道 var channel = connection.CreateModel(); //定义队列 string queueName = channel.QueueDeclare().QueueName; var exchangeSty = "create_PlanInfo_direct"; // exchange:交换器的名称 //type:交换器的类型 //durable:是否持久化,true代表持久化。(持久化会将交换器存入磁盘) // autoDelete:是否自动删除,true表示自动删除。(当该交换器上绑定的最后一个队列 / 交换器解除绑定后,该交换器自动删除) // internal:是否是内置的,true表示内置交换器。(生产者无法直接发消息给内置交换器,只能通过其他交换器路由到该交换器) // argument:其他一些结构化的参数 // 定义交换机 channel.ExchangeDeclare( exchange: exchangeSty, type: "direct", durable: true ); //交换机和队列绑定 channel.QueueBind( queue: queueName, exchange: exchangeSty, routingKey: "product-VX" ); //创建 事件基本消费者 var consumer = new EventingBasicConsumer(channel); //接收到消息事件 consumer.Received += (model, ea) => { var message = Encoding.UTF8.GetString(ea.Body.ToArray()); Console.WriteLine($"客户消费者 预定: {message}"); { //.....业务逻辑代码 } //手动确认消费 channel.BasicAck(ea.DeliveryTag, true); }; //消费能力 Qos(防止多个消费者,能力不一致,导致的系统质量问题。 // 每一次一个消费者只成功消费一个) channel.BasicQos(0, 1, false); //这里设定消费能力强点 是1个 channel.BasicConsume(queue: queueName, autoAck: false,//自动消息确认 ,如果设置为false,会导致消息重复消费 ,那么就需要手动确认 consumer: consumer ); }
客户:
public void Method4() { //创建连接 var connection = factory.CreateConnection(); //创建通道 var channel = connection.CreateModel(); //定义队列 string queueName = channel.QueueDeclare().QueueName; var exchangeSty = "create_PlanInfo_direct"; // exchange:交换器的名称 //type:交换器的类型 //durable:是否持久化,true代表持久化。(持久化会将交换器存入磁盘) // autoDelete:是否自动删除,true表示自动删除。(当该交换器上绑定的最后一个队列 / 交换器解除绑定后,该交换器自动删除) // internal:是否是内置的,true表示内置交换器。(生产者无法直接发消息给内置交换器,只能通过其他交换器路由到该交换器) // argument:其他一些结构化的参数 // 定义交换机 channel.ExchangeDeclare( exchange: exchangeSty, type: "direct", durable: true ); //交换机和队列绑定 channel.QueueBind( queue: queueName, exchange: exchangeSty, routingKey: "product-VX" ); //创建 事件基本消费者 var consumer = new EventingBasicConsumer(channel); //接收到消息事件 consumer.Received += (model, ea) => { var message = Encoding.UTF8.GetString(ea.Body.ToArray()); Console.WriteLine($"客户消费者 预定: {message}"); { //.....业务逻辑代码 } //手动确认消费 channel.BasicAck(ea.DeliveryTag, true); }; //消费能力 Qos(防止多个消费者,能力不一致,导致的系统质量问题。 // 每一次一个消费者只成功消费一个) channel.BasicQos(0, 1, false); //这里设定消费能力强点 是1个 channel.BasicConsume(queue: queueName, autoAck: false,//自动消息确认 ,如果设置为false,会导致消息重复消费 ,那么就需要手动确认 consumer: consumer ); } ———————————————————— 邮件 public void Method4() { //创建连接 var connection = factory.CreateConnection(); //创建通道 var channel = connection.CreateModel(); //定义队列 string queueName = channel.QueueDeclare().QueueName; var exchangeSty = "create_PlanInfo_direct"; // exchange:交换器的名称 //type:交换器的类型 //durable:是否持久化,true代表持久化。(持久化会将交换器存入磁盘) // autoDelete:是否自动删除,true表示自动删除。(当该交换器上绑定的最后一个队列 / 交换器解除绑定后,该交换器自动删除) // internal:是否是内置的,true表示内置交换器。(生产者无法直接发消息给内置交换器,只能通过其他交换器路由到该交换器) // argument:其他一些结构化的参数 // 定义交换机 channel.ExchangeDeclare( exchange: exchangeSty, type: "direct", durable: true ); //交换机和队列绑定 channel.QueueBind( queue: queueName, exchange: exchangeSty, routingKey: "product-MS" ); //创建 事件基本消费者 var consumer = new EventingBasicConsumer(channel); //接收到消息事件 consumer.Received += (model, ea) => { var message = Encoding.UTF8.GetString(ea.Body.ToArray()); Console.WriteLine($"客户消费者 预定: {message}"); { //.....业务逻辑代码 } //手动确认消费 channel.BasicAck(ea.DeliveryTag, true); }; //消费能力 Qos(防止多个消费者,能力不一致,导致的系统质量问题。 // 每一次一个消费者只成功消费一个) channel.BasicQos(0, 1, false); //这里设定消费能力强点 是1个 channel.BasicConsume(queue: queueName, autoAck: false,//自动消息确认 ,如果设置为false,会导致消息重复消费 ,那么就需要手动确认 consumer: consumer ); }


浙公网安备 33010602011771号