主题模式/Topics:
主题模式和路由模式很像
路由模式是精确匹配
主题模式是模糊匹配,更加灵活,更加强大;
主题模式 交换机类型是topic类型 通过通配符方式,消息路由到匹配的队列中。
.匹配一个单词;
#匹配零个或者多个单词;
RabbitMqConfig配置:
1、配置两个队列
/**
* Topic队列名称1
*/
public static final String TOPIC_QUEUE1="topicQueue1";
/**
* Topic队列名称2
*/
public static final String TOPIC_QUEUE2="topicQueue2";
/**
* 定义一个Topic队列1
* @return
*/
@Bean
public Queue topicQueue1(){
return new Queue(TOPIC_QUEUE1);
}
/**
* 定义一个Topic队列2
* @return
*/
@Bean
public Queue topicQueue2(){
return new Queue(TOPIC_QUEUE2);
}
2、配置交换机
/**
* topic交换机名称
*/
public static final String TOPIC_EXCHANGE="topicExchange";
/**
* 定义一个direct交换机,点对点模式消息发送
* @return
*/
@Bean
public TopicExchange topicExchange(){
return new TopicExchange(TOPIC_EXCHANGE);
}
/**
* 定义一个Topic队列的绑定规则1
* @return
*/
@Bean
public Binding topicBinding1(){
return BindingBuilder.bind(topicQueue1()).to(topicExchange()).with("*.orange.*");
}
/**
* 定义一个Topic队列的绑定规则2
* @return
*/
@Bean
public Binding topicBinding2(){
return BindingBuilder.bind(topicQueue2()).to(topicExchange()).with("*.*.rabbit");
}
/**
* 定义一个Topic队列的绑定规则3
* @return
*/
@Bean
public Binding topicBinding3(){
return BindingBuilder.bind(topicQueue2()).to(topicExchange()).with("lazy.#");
}
生产者发送消息1:
1、RabbitMqService接口创建方法
/**
* 发送Topic模式消息
* @return
*/
public void sendTopicMessage();
2、RabbitMqServiceImpl创建方法实现
@Override
public void sendTopicMessage() {
amqpTemplate.convertAndSend(RabbitMqConfig.TOPIC_EXCHANGE,"quick.orange.rabbit","Q1=1条消息,Q2=1条消息");
}
3、启动测试:
package com.java996.producer;
import com.java996.producer.Service.RabbitMqService;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
@SpringBootApplication
public class ProducerApp {
public static void main(String[] args) {
ConfigurableApplicationContext context = SpringApplication.run(ProducerApp.class,args);
RabbitMqService rabbitMqService = (RabbitMqService) context.getBean("RabbitMqService");
rabbitMqService.sendTopicMessage();
}
}
4、交换机的绑定关系
5、队列
消费者接收消息:
1、RabbitMqServiceImpl更改之前的接收方法
@Override
@RabbitListener(queues = {RabbitMqConfig.TOPIC_QUEUE1}) //监听队列
public void receiveMessage2(String message) {
//System.out.println("消费者1,接收到的消息:"+message);
System.out.println("队列1,接收到的消息:"+message);
}
@Override
@RabbitListener(queues = {RabbitMqConfig.TOPIC_QUEUE2}) //监听队列
public void receiveMessage3(String message) {
//System.out.println("消费者2,接收到的消息:"+message);
System.out.println("队列2,接收到的消息:"+message);
}
测试接收消息1:
生产者发送消息2:
@Override
public void sendTopicMessage() {
//amqpTemplate.convertAndSend(RabbitMqConfig.TOPIC_EXCHANGE,"quick.orange.rabbit","Q1=1条消息,Q2=1条消息");
amqpTemplate.convertAndSend(RabbitMqConfig.TOPIC_EXCHANGE,"lazy.orange.elephant","Q1=1条消息,Q2=1条消息");
}
测试接收消息2:
生产者发送消息3:
@Override
public void sendTopicMessage() {
//amqpTemplate.convertAndSend(RabbitMqConfig.TOPIC_EXCHANGE,"quick.orange.rabbit","Q1=1条消息,Q2=1条消息");
//amqpTemplate.convertAndSend(RabbitMqConfig.TOPIC_EXCHANGE,"lazy.orange.elephant","Q1=1条消息,Q2=1条消息");
amqpTemplate.convertAndSend(RabbitMqConfig.TOPIC_EXCHANGE,"quick.orange.fox","Q1=1条消息");
}
测试接收消息3:
生产者发送消息4:
@Override
public void sendTopicMessage() {
//amqpTemplate.convertAndSend(RabbitMqConfig.TOPIC_EXCHANGE,"quick.orange.rabbit","Q1=1条消息,Q2=1条消息");
//amqpTemplate.convertAndSend(RabbitMqConfig.TOPIC_EXCHANGE,"lazy.orange.elephant","Q1=1条消息,Q2=1条消息");
//amqpTemplate.convertAndSend(RabbitMqConfig.TOPIC_EXCHANGE,"quick.orange.fox","Q1=1条消息");
amqpTemplate.convertAndSend(RabbitMqConfig.TOPIC_EXCHANGE,"lazy.brown.fox","Q2=1条消息");
}
测试接收消息4:
生产者发送消息5:
@Override
public void sendTopicMessage() {
//amqpTemplate.convertAndSend(RabbitMqConfig.TOPIC_EXCHANGE,"quick.orange.rabbit","Q1=1条消息,Q2=1条消息");
//amqpTemplate.convertAndSend(RabbitMqConfig.TOPIC_EXCHANGE,"lazy.orange.elephant","Q1=1条消息,Q2=1条消息");
//amqpTemplate.convertAndSend(RabbitMqConfig.TOPIC_EXCHANGE,"quick.orange.fox","Q1=1条消息");
//amqpTemplate.convertAndSend(RabbitMqConfig.TOPIC_EXCHANGE,"lazy.brown.fox","Q2=1条消息");
amqpTemplate.convertAndSend(RabbitMqConfig.TOPIC_EXCHANGE,"quick.brown.fox","消息丢失,Q1Q2=0");
}