消息队列 - RabbitMQ 集成 SpringBoot (Simplest)

266

这是史上最简单的 SpringBoot & RabbitMQ 集成的 demo!

一、依赖配置

对于 Java SE ,RabbitMQ 提供了 amqp-client 依赖

<dependency>
    <groupId>com.rabbitmq</groupId>
    <artifactId>amqp-client</artifactId>
    <version>3.6.5</version>
</dependency>

对于 SpringBoot,RabbitMQ 也适配了对应的 amqp-client 依赖

<dependency>
    <groupId>com.rabbitmq</groupId>
    <artifactId>amqp-client</artifactId>
    <version>3.6.5</version>
</dependency>

那么,建立一个项目,导入以下依赖:

  • amqp:使用 RabbitMQ 要用的依赖
  • hutool:开源的常用工具类,这里用来做日志
  • test:用来做单元测试
  • lombok :这里我用来精简 bean 的操作
<dependencies>
    <!--    amqp    -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-amqp</artifactId>
        <version>2.2.2.RELEASE</version>
    </dependency>
    <!--    hutool    -->
    <dependency>
        <groupId>cn.hutool</groupId>
        <artifactId>hutool-all</artifactId>
        <version>4.3.1</version>
    </dependency>

    <!--    test    -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <version>2.2.2.RELEASE</version>
        <scope>test</scope>
    </dependency>
    
        <!--    lombok 依赖    -->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.10</version>
        <scope>provided</scope>
    </dependency>

</dependencies>

之后需要配置一下项目使用的队列服务信息:

spring:
  rabbitmq:
    host: localhost
    port: 5672
    # 登录 15672 端口后台的用户名和密码
    username: admin
    password: admin

  • host :RabbitMQ 的服务地址
  • port :RabbitMQ 的服务端口(不是管理后台插件的端口,是本身的服务端口)
  • username :RabbitMQ 的管理后台插件的账户
  • password : RabbitMQ 的管理后台插件的密码

常见的是管理后台插件的端口是 15672,而 RabbitMQ 的管理后台插件的端口是 5672 / 5671 ,这个可以查本机服务

这里的 username 和 password 是我自己在后台新加的,默认的用户密码都是 guest

二、配置类

一般创建在 RabbitMQ & SpringBoot 中的常见操作,如创建队列,交换器,绑定,处理器都会写一个 RabbitMQ 配置类,然后在里面用 @Bean 注入创建

@Configuration
public class RabbitMqConfig {

    /**
     * 创建一个队列,名字未 springboot-queue-hello
     *
     * @return AMQP 模型中的队列
     */
    @Bean
    public Queue queue() {
        return new Queue("springboot-queue-hello");
    }

}

三、生产者

发送消息到名为 springboot-queue-hello 的队列中

创建一个 bean

@Data
@Accessors(chain = true)
public class Book implements Serializable {
    private Integer id;
    private String name;
    private Integer price;
}

创建生产者,分别生成字符消息和对象消息(这里指定的对象是 Book)

@Component
public class Producer {

    private static final Log LOGGER = LogFactory.get();

    @Autowired
    private AmqpTemplate rabbitTemplate;

    public void produceHelloMessage() {
        String strMessage = "RabbitMQ-SpringBoot | Hello message " + new Date();
        LOGGER.warn("Producer :" + strMessage);
        this.rabbitTemplate.convertAndSend("springboot-queue-hello", strMessage);
    }

    public void produceObjMessage() {
        Book bookMessage = new Book()
            .setId(1)
            .setName(" 《 Jalr4ever's Blog 》 ")
            .setPrice(100);
        LOGGER.warn("Producer: " + bookMessage);
        this.rabbitTemplate.convertAndSend("springboot-queue-hello",bookMessage);
    }

}

四、消费者

监听名字为 springboot-queue-hello 的队列,如果有消息,则消费消息

@Component
@RabbitListener(queues = "springboot-queue-hello")
public class Consumer {

    private static final Log LOGGER = LogFactory.get();

    @RabbitHandler()
    public void consumeStrMessage(String helloMsg) {
        LOGGER.warn("Consumer : " + helloMsg);
    }

    @RabbitHandler
    public void consumeObjMessage(Book objMsg) {
        LOGGER.warn("Consumer : " + objMsg);
    }

}

五、测试

创建一个生产者的生产方法的测试方法:

@SpringBootTest
@RunWith(SpringRunner.class)
public class ProducerTest {

    @Autowired
    private Producer producer;

    @Test
    public void produce() {
        this.producer.produce();
    }
}

可以看到生产者和消费者的字符消息通讯正常

六、总结

本次简单的 demo 用到的 AMQP 注解有:

  • @RabbitListener 用来将消费者绑定到队列
  • @RabbitHandler 在绑定了队列的消费者中定义消费逻辑