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
                        );
}

 

posted @ 2025-05-29 14:10  逆流而下  阅读(20)  评论(0)    收藏  举报