8.SpringBoot整合RabbitMQ

SpringBoot使用了Spring AMQP来操作RabbitMQ,官网也提供了很多示例,同时RabbitMQ的官网也针对每种消息类型提供了AMQP版的实现。这里以Work Queues为例,看看如何在SpringBoot中使用Spring AMQP。

1.准备工作

  1. 引入RabbitMQ的Starters。如果你是STS,可以右键pom.xml文件,选择Spring -> Edit Starters,搜索并勾选RabbitMQ。

  2. 在application.yaml文件中,配置RabbitMQ的连接属性

spring:
  rabbitmq:
    host: 192.168.128.135
    port: 5672
    virtual-host: /chenbin
    username: chenbin
    password: chenbin
  1. 在@SpringBootApplication标注的类上,加入@EnableRabbit注解
//使@RabbitListener生效
@EnableRabbit
@SpringBootApplication
public class ElasticsearchApplication {
    public static void main(String[] args) {
        SpringApplication.run(ElasticsearchApplication.class, args);
    }
}

2.创建队列和消费者

新建一个配置类,我们来创建队列和消费者。项目启动时,创建@Bean指定的对象,同时会在RabbitMQ创建对应的队列和消费者。Spring将会自动检测队列和消费者是否已经存在了,如果存在了,就不会再建了,避免了手动创建时会出现重复创建的问题。

/**
 * RabbitMQ配置类
 * 这里使用work queues模式
 * 一个队列 两个消费者
 * Spring AMQP默认已经帮我们实现了:
 * ①队列/消息持久化
 * ②手动应答
 * ③公平分发,能者多劳
 */
@Configuration
public class RabbitMQConfig {
    public static final String QUEUE_NAME = "index_queue";

    // 向RabbitMQ发消息时,不用默认的序列化方式,使用json格式
    @Bean
    public MessageConverter messageConverter() {
        return new Jackson2JsonMessageConverter();
    }

    // 创建队列 在该Bean加入Spring容器时就会创建该队列
    @Bean
    public Queue indexQueue() {
        return new Queue(QUEUE_NAME);
    }
    
    // 创建消费者1
    @Bean
    public RabbitMQReceiver receiver1() {
        return new RabbitMQReceiver();
    }
    
    // 创建消费者2
    @Bean
    public RabbitMQReceiver receiver2() {
        return new RabbitMQReceiver();
    }
}

因为是Work Queues模式,所以我们建了一个队列,两个消费者。之前使用amqp-client.jar时,持久化,手动应答,公平分发都需要自己来实现,现在Spring AMQP默认已经实现了这些功能,详情可参见RabbitMQ的官方文档

3. 生产者发送消息

使用RabbitTemplate来发送消息

@Autowired
RabbitTemplate rabbitTemplate;
//自定义的消息bean
RabbitMessage rabbitMessage = new RabbitMessage();
rabbitTemplate.convertAndSend(RabbitMQConfig.QUEUE_NAME,rabbitMessage);

4. 消费者接收消息

@RabbitListener 指明消费者监听的队列
@RabbitHandler 收到消息后,触发对应的方法

//从指定队列中接收消息
@RabbitListener(queues=RabbitMQConfig.QUEUE_NAME)
public class RabbitMQReceiver {
  @RabbitHandler
  public void handleMessage(RabbitMessage rabbitMessage) throws InterruptedException {
    //这里根据业务逻辑对收到的消息进行处理
  }
}

可以看到,使用Spring AMQP还是很简单的,很多东西都帮你封装好了,这或许是Spring这个生态系统如此流行的一个重要原因吧。如果你需要其他消息类型比如Routing,Tpoics,可以参看RabbitMQ官网上AMQP版的实现。

你可能感兴趣的:(8.SpringBoot整合RabbitMQ)