美文网首页
rabbitmq 注解配置使用(二)topic模式

rabbitmq 注解配置使用(二)topic模式

作者: 蘑菇Ai布丁 | 来源:发表于2018-11-28 10:12 被阅读0次

    rabbitmq 有三种消息模式 fanout,direct,topic

    我们可以理解 fanout 广播模式,相当于不去管队列是谁,我就是一个广播站,所有连接到我这个站的队列,都可以收到相同的消息,

    direct 一对一的路由,我只能匹配精准名称的队列

    topic 模糊匹配模式,可以用.#或者.*来模糊匹配路由名称,例如 a.aaa我们可以用a.*来匹配,但是如果是a.aaa.aaaa就必须用a.#来匹配

    这一模块我们来讲讲topic路由模式的简单实用,依赖引入都是一样的。

    第一部:写队列的配置类

    @Configuration

    public class TopicRabbitConfig {

    public static final Stringmessage ="topic.message";

    public static final Stringmessages ="topic.messages";

    /**

    * 定义消息队列1

        * @return

        */

        @Bean(name ="queueMessage")

    public Queue messageQueue(){

    return new Queue(TopicRabbitConfig.message);

    }

    /**

    * 定义消息队列2

        * @return

        */

        @Bean(name ="queueMessages")

    public Queue messagesQueue(){

    return new Queue(TopicRabbitConfig.messages);

    }

    /**

    * 定义交换机

    */

        @Bean

        public TopicExchange exchange(){

    return new TopicExchange("topicExchange");

    }

    /**

    * 绑定消息队列到交换机,路由key:topic.message

        * @return

        */

        @Bean

        Binding bindingExchangeMessage(Queue queueMessage, TopicExchange exchange) {

    return BindingBuilder.bind(queueMessage).to(exchange).with("topic.message");

    }

    /**

    * 绑定消息队列到交换机,路由key:topic.#

        * @return

        */

        @Bean

        Binding bindingExchangeMessages(Queue queueMessages, TopicExchange exchange){

    return BindingBuilder.bind(queueMessages).to(exchange).with("topic.#");

    }

    }

    第二部:写消息的生产者

    @Component

    public class TopicSend {

    @Autowired

        private AmqpTemplateamqpTemplate;

    public void send1(){

    String context ="hi, i am message 1";

    amqpTemplate.convertAndSend("topicExchange","topic.message",context);

    }

    public void send2(){

    String context ="hi, i am message 2";

    amqpTemplate.convertAndSend("topicExchange","topic.messages",context);//交换机、路邮键

        }

    }

    第三部:写消息的消费者

    @Component

    @Slf4j

    public class TopicReceiver {

    @RabbitHandler

        @RabbitListener(queues ="topic.message")

    public void process(String message) {

    log.info("Topic Receiver1  : " + message);

    }

    @RabbitHandler

        @RabbitListener(queues ="topic.messages")

    public void process2(String message) {

    log.info("Topic Receiver2  : " + message);

    }

    }

    然后我们可以看到打印信息是:

    Topic Receiver1 : hi, i am message 1

    Topic Receiver2 : hi, i am message 1

    Topic Receiver2 : hi, i am message 2

    messages只接受到了一条。

    和topic不同的一个是Fanou类型,这个类型的路由不匹配队列名称,也就是说所有连接到这个路由上的队列,都可以收到这个路由中的所有的消息。

    代码中的唯一不同就是

    public FanoutExchangefanoutExchange(){

    return new FanoutExchange("fanoutExchange");

    }

    在申明路由的时候,使用FanoutExchange

    相关文章

      网友评论

          本文标题:rabbitmq 注解配置使用(二)topic模式

          本文链接:https://www.haomeiwen.com/subject/jgzoqqtx.html