SpringBoot集成Rabbitmq

4,365 阅读2分钟

一、核心思路

1、生产者发送消息的时候会携带routing key
2、channel通道中定义Queue、定义Exchange、绑定Queue与Exchange、发布消息 3、交换机通过配置binding key与Queue进行绑定

所以我们需要做一下几件事:
1、连接上rabbitmq
2、新建配置类config:定义Queue、定义Exchange、绑定Queue与Exchange
3、生产者发送消息到队列
4、消费者通过交换机取相应队列中的消息进行消费

二、代码实现

1、引入依赖

<!--消息队列模块-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

2、application.yml配置连接上rabbitmq

spring:
  rabbitmq:
    host: 主机ip
    port: 5672
    username: guest
    password: guest

3、配置类定义Queue、定义Exchange、绑定Queue与Exchange

@Configuration
public class RabbitConfig {
    @Value("${spring.rabbitmq.host}")
    private String host;

    @Value("${spring.rabbitmq.port}")
    private int port;

    @Value("${spring.rabbitmq.username}")
    private String username;

    @Value("${spring.rabbitmq.password}")
    private String password;
    // 定义一个或多个交换机
    public static final String EXCHANGE_A = "my-mq-exchange_A";
    // public static final String EXCHANGE_B = "my-mq-exchange_B";
    
    // 定义队列
    public static final String QUEUE_A = "QUEUE_A";
    // public static final String QUEUE_B = "QUEUE_B
    
    // 定义routing-key
    public static final String ROUTING_KEY_A = "spring-boot-routingKey_A";
   //  public static final String ROUTING_KEY_B = "spring-boot-routingKey_B";
    
  /**
     * 针对消费者配置
     * 1. 设置交换机类型
     * 2. 将队列绑定到交换机
     FanoutExchange: 将消息分发到所有的绑定队列,无routingkey的概念
     HeadersExchange :通过添加属性key-value匹配
     DirectExchange:按照routingkey分发到指定队列
     TopicExchange:多关键字匹配
   **/
   @Bean
    public DirectExchange defaultExchange() {
        return new DirectExchange(EXCHANGE_A);
    }
    
    /**
     * 获取队列A
     * @return
     */
    @Bean
    public Queue queueA() {
        return new Queue(QUEUE_A, true); //队列持久
    }
    // 一个交换机可以绑定多个消息队列,也就是消息通过一个交换机,可以分发到不同的队列当中去。
    @Bean
    public Binding binding() {
        return BindingBuilder.bind(queueA()).to(defaultExchange()).with(RabbitConfig.ROUTING_KEY_A);
    }
    
    // 创建连接工厂,获取MQ的连接
    @Bean
    public ConnectionFactory connectionFactory() {
        CachingConnectionFactory connectionFactory = new CachingConnectionFactory(host,port);
        connectionFactory.setUsername(username);
        connectionFactory.setPassword(password);
        connectionFactory.setVirtualHost("/");
        return connectionFactory;
    }
    
    // 创建rabbitTemplate
    @Bean(name = "rabbitTemplate")
    public RabbitTemplate rabbitTemplate() {
        RabbitTemplate template = new RabbitTemplate(connectionFactory());
        return template;
    }

4、生产者

@Component
public class MsgProducer{
    @Autowired
    private RabbitTemplate rabbitTemplate;

    private void sendMsg(String content) {
        CorrelationData correlationId = new CorrelationData(UUID.randomUUID().toString());
        //把消息放入ROUTING_KEY_A对应的队列当中去,对应的是队列A
        rabbitTemplate.convertAndSend(RabbitConfig.EXCHANGE_A, RabbitConfig.ROUTING_KEY_A, content, correlationId);
    }
}

5、消费者

Component
@RabbitListener(queues = RabbitConfig.QUEUE_A)
public class MsgReceiver {
    @RabbitHandler
    public void process(String content) {
        System.out.println("接收处理队列A当中的消息: " + content);
    }
}

6、测试

@SpringBootTest
class RabbitmqDemoApplicationTests {
    @Autowired
    private MsgProducer msgProducer;
    @Test
    public void test(){
        msgProducer.sendMsg("hello,this is my msg");
    }
}

结果

接收处理队列A当中的消息: hello,this is my msg

借鉴:blog.csdn.net/qq_38455201…