消息队列之RabbitMQ之主题(Topics)模式

前言:RabbitMQ是一个消息中间件:它接受并转发消息。相当于一个快递站,只存放消息。快递员分配东西到快递站,相当于生产者生产消息到MQ中,买家从快递站拿快递,相当于消费者从MQ中取出消息。RabbitMQ与快递站的主要区别在于,它不处理快件而是接收、存储和转发消息数据,在RabbitMQ的六种工作模式中,最常用的为主题(Topics)模式。下面我们来具体介绍一下RabbitMQ的主题(Topics)工作模式。

1.首先在生产者项目的配置文件application.yml中进行RabbitMQ的的相关配置。消息队列之RabbitMQ之主题(Topics)模式_第1张图片

 2.新建RabbitmqConfig文件进行创建交换机,队列,队列绑定交换机,其中,在队列绑定交换机的中with属性即是设置路由键,该路由键(routingkey)可以任意设置一个字符串。此处即是主题模式与其他工作模式的主要区别。若有多个队列,路由键即是区分不同的队列的。这样就完成了队列的创建与绑定。

注意:

通配符规则:

①消息设置routingkey时,routingkey可以由多个单词构成,中间以.分割

②队列设置routingkey时,#可以匹配任意多个单词,*可以匹配任意一个单词

package com.study.rabbitmq;

import org.springframework.amqp.core.*;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
 * RabbitMQ配置文件
 */
@Configuration
public class RabbitmqConfig {
    private final String EXCHANGE_NAME="boot_topic_exchange";
    private final String QUEUE_NAME="boot_queue";

    //创建交换机
    @Bean("bootExchange")
    public Exchange getExchange(){
        return ExchangeBuilder
                .topicExchange(EXCHANGE_NAME)//交换机类型
                .durable(true)//是否持久化
                .build();
    }
    //创建队列
    @Bean("bootQueue")
    public Queue getMessageQueue(){

       // return new Queue(QUEUE_NAME);
    }

    //交换机绑定队列
    @Bean
    public Binding bindMessageQueue(@Qualifier("bootExchange") Exchange exchange, 
    @Qualifier("bootQueue") Queue queue){
    return BindingBuilder
            .bind(queue)
            .to(exchange)
            .with("#.message.#")
            .noargs();
    }

}

3.创建测试类,进行消息发送。发送消息调用RabbitTemplate的内部方法convertAndSend,该方法有三个参数,第一个参数对应的是交换机名称,第二个参数对应的为路由键,即是在队列绑定交换机是with属性中定义的字符串,第三个参数为发送的消息内容。运行该方法,消息内容发送完毕。

package com.study.rabbitmq;


import org.junit.jupiter.api.Test;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
public class TestProducer {
    //注入RabbitTemplate工具类
    @Autowired
    private RabbitTemplate rabbitTemplate;

    @Test
    public void testSendMessage() {
        rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() {
        /**
         * 发送消息
         * 参数1 :交换机
         * 参数2:路由key
         * 参数3:要发送的消息
         * */
        rabbitTemplate.convertAndSend("boot_topic_exchange", "message", "测试发送消息");
    }

4.监听消息,并进行消息的接收与处理。同样的,在消费者项目中也要在application.yml中进行RabbitMQ的相关配置。编写消费者测试类。代码如下:

其中@RabbitListener注解声明要监听的队列名"boot_queue",队列名是在创建队列时定义的。参数message即为该队列中的消息。

package com.study.rabbitmq1.Consumer;

import com.rabbitmq.client.Channel;
import org.springframework.amqp.rabbit.annotation.RabbitListener;

import org.springframework.stereotype.Component;

import java.io.IOException;


//消费者
@Component
public class Consumer {
    //监听列队
    @RabbitListener(queues = "boot_queue")
    public void listenMessage(Message message, Channel channel)  {
      
            int i = 1 / 0;//模拟处理消息出现的bug
            System.out.println("接受消息:" + message.getBody());

    }
}

以上就是RabbitMQ的主题工作模式的基本使用过程。 

你可能感兴趣的:(rabbitmq,分布式)