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