三、七种消息收发模型之Publish/Subscribe

 

 发布订阅模式

 

四种交换机:

  1 Direct交换机:

    通过routing_key将信息路由给对应的queue,消费者监听对应的queue获取消息

   分为三步:

    1 创建队列

    @Bean
    Queue directQueue1(){
        return new Queue(DIRECT_QUEUE_NAME,true,false,false);
    }

    2 创建交换机

    /**
     * 定义一个直连交换机
     * @return
     */
    @Bean
    DirectExchange directExchange(){
        //1.交换机名称
        //2.交换机是否持久化(交换机本身是否持久化)
        //3.如果没有与之绑定的队列,是否需要移除交换机
        return new DirectExchange(DIRECT_EXCHANGE_NAME,true,false);
    }

    3 将队列和交换机进行绑定

    /**
     * 这个定义是将交换机和队列绑定起来
     * @return
     */
    @Bean
    Binding directBinding1(){
        return BindingBuilder
                //设置绑定的队列
                .bind(directQueue1())
                //设置绑定的交换机
                .to(directExchange())
                //设置routing_key
                .with(DIRECT_QUEUE_NAME);
    }

    完整配置类

/**
 * Direct:这种路由策略,将消息队列绑定到DirectExchange上,当消息到达交换机的时候,消息会携带一个routing_key,然后交换机会找到名为routing_key的队列,将消息路由过去
 */
@Configuration
public class RabbitConfig {

    public static final String DIRECT_QUEUE_NAME="direct_queue_name";
    public static final String DIRECT_QUEUE_NAME2="direct_queue_name2";
    public static final String DIRECT_EXCHANGE_NAME="direct_exchange_name";

    @Bean
    Queue directQueue1(){
        return new Queue(DIRECT_QUEUE_NAME,true,false,false);
    }

    @Bean
    Queue directQueue2(){
        return new Queue(DIRECT_QUEUE_NAME2,true,false,false);
    }

    /**
     * 定义一个直连交换机
     * @return
     */
    @Bean
    DirectExchange directExchange(){
        //1.交换机名称
        //2.交换机是否持久化(交换机本身是否持久化)
        //3.如果没有与之绑定的队列,是否需要移除交换机
        return new DirectExchange(DIRECT_EXCHANGE_NAME,true,false);
    }

    /**
     * 这个定义是将交换机和队列绑定起来
     * @return
     */
    @Bean
    Binding directBinding1(){
        return BindingBuilder
                //设置绑定的队列
                .bind(directQueue1())
                //设置绑定的交换机
                .to(directExchange())
                //设置routing_key
                .with(DIRECT_QUEUE_NAME);
    }

    /**
     * 将第二个队列也绑定到同一个交换机
     * @return
     */
    @Bean
    Binding directBinding2(){
        return BindingBuilder
                //设置绑定的队列
                .bind(directQueue2())
                //设置绑定的交换机
                .to(directExchange())
                //设置routing_key
                .with(DIRECT_QUEUE_NAME2);
    }

}

 

  2 Fanout交换机:

 

posted @ 2022-08-04 16:46  WaterGe  阅读(90)  评论(0编辑  收藏  举报