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

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模式)