MQ消息队列

本文介绍了SpringAMQP中三种常见的消息交换机类型:Fanout、Direct和Topic。在Fanout模式下,消息会被广播到所有绑定的队列。Direct模式下,消息根据指定的key路由到匹配的队列。Topic模式允许使用通配符进行更灵活的路由。文中通过详细步骤展示了如何配置和使用这些交换机进行消息发送和接收。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MQ 简单队列发送消息

1.在消息发送服务项目 和消息接收服务项目 引入依赖包

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-amqp</artifactId>
    <version>2.3.9.RELEASE</version>
</dependency>

2. 在消息发送服务项目和消息接收服务项目的application.yml文件配置MQ信息

spring:
  rabbitmq:
    host: 192.168.126.195      mq所在主机ip
    virtual-host: /            mq虚拟主机
    username: mqroot           mq登录账号
    password: mq1234           mq登录密码
    port: 5672                 mq安装时设定的发送消息端口号

3. 在消息发送服务项目写入

4.在消息接收服务项目写下如下:

此类消息队列 需要建立连接创建出 消息队列 

***SpringAMQP发布订阅模型***

第一种:Fanout Exchange 广播

1.在消息接收服务项目 声明交换机 队列  并把队列绑定到交换机上

@Configuration
public class fanoutFig {
    //   注册交换机
    @Bean
    public FanoutExchange fanout_jiaohuanji() {
        return new FanoutExchange("Fanout_jiaohuanji");  //交换机名称
    }

    //    注册队列1
    @Bean
    public Queue queue_duilie1() {
        return new Queue("Queue_duilie1");    //队列1名称
    }

    //    注册队列2
    @Bean
    public Queue queue_duilie2() {
        return new Queue("Queue_duilie2");    //队列2名称
    }

    //绑定队列1到交换机
    @Bean
    public Binding fanout_binding1(Queue queue_duilie1, FanoutExchange fanout_jiaohuanji) {
        return BindingBuilder.bind(queue_duilie1).to(fanout_jiaohuanji);
    }

    //绑定队列2到交换机
    @Bean
    public Binding fanout_binding2(Queue queue_duilie2, FanoutExchange fanout_jiaohuanji) {
        return BindingBuilder.bind(queue_duilie2).to(fanout_jiaohuanji);
    }
}

2. 在消息接收服务项目 编写两个方法分别监听 队列1和2

//    FanoutExchange交换机接收消息
    @RabbitListener(queues = "Queue_duilie1")
    public void springAMQPjieshou1(String xiaoxi) {
        System.out.println("spring 消费者Queue_duilie1接收到消息  :【" +xiaoxi + "】");
    }

    @RabbitListener(queues = "Queue_duilie2")
    public void springAMQPjieshou2(String xiaoxi) {
        System.err.println("spring 消费者Queue_duilie2接收到消息  :【" + xiaoxi + "】");
    }

3.在消息发送服务项目 发送消息

    //   向 FanoutExchange 交换机发送消息
    @Test
    public void fanoutfasong() {                                                                                                                     // 此处交换机名称和服务接收的交换机名称一致
        String fanoutexchange = "Fanout_jiaohuanji";    //交换机名称  
        String xiaoxi = "hello FanoutExchange";         // 消息
        rabbitTemplate.convertAndSend(fanoutexchange, "", xiaoxi);
    }

第二种 :Direct Exchange  根据指定key 匹配到正确的key的队列上 并接收该队列的消息。会将接收到的消息根据规则路由到指定的Queue,因此称为路由模式(routes)

1.在消息接收服务项目  注册交换机  队列并声明 key值

2. 在消息发送服务项目 发送消息

第三种:TopicExchange,TopicExchange与DirectExchange类似,区别在于routingKey必须是多个单词的列表,并且以.分割 。                                                                                                Queue与Exchange指定BindingKey时可以使用通配符
#: 代指0个或多个单词 
*: 代指一个单词

1. 在消息接收服务项目 声明 交换机  队列   key


 //    TopicExchange 路由 交换机配置 接收消息
    @RabbitListener(bindings = @QueueBinding(                                                                                         //交换机名称,type指定交换机类型
            exchange = @Exchange(value = "top_exchange", type = ExchangeTypes.TOPIC),
            value = @Queue("topic_queue_1"),        //队列名称
            key = {"fan.#"}  
    ))
    public void Topic_exchange1(String msg) {
        System.out.println("spring 消费者topic_queue_1_fan.#接收到消息  :【" + msg + "】");
    }

    //    TopicExchange 路由 交换机配置 接收消息
    @RabbitListener(bindings = @QueueBinding(                                                                                          //交换机名称,type指定交换机类型
            exchange = @Exchange(value = "top_exchange", type = ExchangeTypes.TOPIC),
            value = @Queue("topic_queue_2"),        //队列名称
            key = {"jun.#"}
    ))
    public void Topic_exchange2(String msg) {
        System.err.println("spring 消费者topic_queue_2_jun.#接收到消息  :【" + msg + "】");
    }

2.在消息发送服务项目  发送消息                                                                                                          @Test
    public void TopicExchangefasong1() {
        String fanoutexchange = "top_exchange";
        String xiaoxi = "hello fan.jun";
        rabbitTemplate.convertAndSend(fanoutexchange, "fan.key", xiaoxi);
    }
  @Test
    public void TopicExchangefasong2() {
        String fanoutexchange = "top_exchange";
        String xiaoxi = "hello jun.ning";
        rabbitTemplate.convertAndSend(fanoutexchange, "jun.ning", xiaoxi);
    }

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值