11.RabbitMQ 主题模式

本文详细介绍了RabbitMQ中主题模式的原理,包括其与路由模式的区别,以及如何通过配置topic交换机、队列和绑定规则实现消息的模糊匹配。生产者和消费者的例子展示了如何使用topic模式发送和接收消息。
摘要由CSDN通过智能技术生成

主题模式/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");
}

测试接收消息5:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值