介绍

:::tips Topic类型的Exchange与Direct相比,都是可以根据RoutingKey把消息路由到不同的队列,但是Topic类型的Exchange可以让队列在绑定RoutingKey的时候使用通配符

RoutingKey一般由一个或多个单词组成,多个单词之间以.分割

通配符规则:

  • :匹配0个或多个词

  • *:匹配1个词

Direct交换机与Topic交换机的差异:

  • Direct交换机将消息路由到与消息中的路由key完全匹配的队列中
  • Topic交换机可以将消息路由到与消息中的路由key完全匹配的队列中,同时可以使用通配符来匹配路由key
    • #:代表0个或多个词
    • *:代表1个词

image.png :::

引入依赖

:::tips 在父工程中引入SpringAMQP的依赖(在消息生产者和消息消费者中都引入依赖) :::

  1. <!-- SpringAMQP依赖 -->
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-amqp</artifactId>
  5. </dependency>

发送消息

添加配置

:::tips 在消息生产者的配置文件中添加配置 :::

  1. spring:
  2. rabbitmq:
  3. #RabbitMQ服务的IP地址
  4. host: IP地址
  5. #RabbitMQ服务的端口号
  6. port: 端口号
  7. #RabbitMQ的虚拟主机
  8. virtual-host: /
  9. #RabbitMQ服务的用户名
  10. username: 用户名
  11. #RabbitMQ服务的密码
  12. password: 密码

编写代码

:::tips 在消息生产者中需要发送消息的类里面注入RabbitTemplate对象,然后调用这个对象的convertAndSend方法(参数一是交换机名称,参数二是路由key,参数三是消息内容)来发送消息 :::

  1. @SpringBootTest
  2. public class MyTest {
  3. //注入RabbitTemplate对象
  4. @Autowired
  5. private RabbitTemplate rabbitTemplate;
  6. @Test
  7. public void test() {
  8. //指定交换机名称
  9. String exchangeName = "exchange.topic";
  10. //指定路由key
  11. String routingKey = "china.news";
  12. //构建消息
  13. String message = "这是一条测试消息";
  14. //发送消息
  15. rabbitTemplate.convertAndSend(exchangeName, routingKey, message);
  16. }
  17. }

接收消息

添加配置

:::tips 在每个消息消费者的配置文件中添加配置 :::

  1. spring:
  2. rabbitmq:
  3. #RabbitMQ服务的IP地址
  4. host: IP地址
  5. #RabbitMQ服务的端口号
  6. port: 端口号
  7. #RabbitMQ的虚拟主机
  8. virtual-host: /
  9. #RabbitMQ服务的用户名
  10. username: 用户名
  11. #RabbitMQ服务的密码
  12. password: 密码

编写代码

:::tips 在每个消息接收者中都新建一个listener包,然后在listener包下创建一个类,类上需要打上@Component注解将其注册到Spring容器中,否则无法接收消息

在这个类里面创建一个方法,方法上打上@RabbitListener注解,用来监听消息

  • 指定@RabbitListener注解的bindings属性为@QueueBinding注解,用来声明绑定队列和交换机,如果队列和交换机不存在会自动创建
    • 指定@QueueBinding注解的value属性为@Queue注解,用来声明队列
      • 指定@Queue注解的name属性为队列名称,用来指定队列名称
    • 指定@QueueBinding注解的exchange属性为@Exchange注解,用来声明交换机
      • 指定@Exchange注解的name属性为交换机名称,用来指定交换机名称
      • 指定指定@Exchange注解的type属性为ExchangeTypes.TOPIC,用来指定交换机类型为主题类型
    • 指定@QueueBinding注解的key属性为路由key,用来指定路由规则

在方法中添加一个形参,形参的类型需要和消息生产者发送的消息类型保持一致,那么这个方法就会持续监听指定队列的消息,如果监听到消息,就会将消息传递给形参 :::

  1. //将这个类注册到Spring容器中
  2. @Component
  3. public class RabbitMqListener {
  4. //声明绑定队列和交换机,并监听消息,如果队列和交换机不存在会自动创建
  5. @RabbitListener(bindings = @QueueBinding(
  6. value = @Queue(name = "topic.queue1"),
  7. exchange = @Exchange(name = "exchange.topic",type = ExchangeTypes.TOPIC),
  8. key = {"china.#"}
  9. ))
  10. public void listen(String msg) throws InterruptedException {
  11. System.out.println("接收到消息:" + msg);
  12. }
  13. }